fixed the prevent issues for CA android platform.
authorjihwanseo <jihwan.seo@samsung.com>
Wed, 16 Sep 2015 11:55:46 +0000 (20:55 +0900)
committerPatrick Lankswert <patrick.lankswert@intel.com>
Fri, 18 Sep 2015 15:41:44 +0000 (15:41 +0000)
-remove the logically dead code
-memory leak
-dereferencing null pointer

Change-Id: Ided9d1fc0a909f10309df47e23b04d7f1ca8db22
Signed-off-by: hyuna0213.jo <hyuna0213.jo@samsung.com>
Signed-off-by: jihwan.seo <jihwan.seo@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2591
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Jaehong Jo <jaehong.jo@samsung.com>
Reviewed-by: Patrick Lankswert <patrick.lankswert@intel.com>
resource/csdk/connectivity/samples/android/casample/sampleService/src/main/jni/ResourceModel.c
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrnwmonitor.c
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c
resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c
resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c

index 4ac7f96..0c62fff 100644 (file)
@@ -390,6 +390,8 @@ Java_org_iotivity_ca_service_RMInterface_RMSendRequest(JNIEnv *env, jobject obj,
                 {
                     LOGE("read has failed");
                     (*env)->ReleaseStringUTFChars(env, payload, path);
+                    CADestroyToken(token);
+                    CADestroyEndpoint(endpoint);
                     return;
                 }
                 (*env)->ReleaseStringUTFChars(env, payload, path);
@@ -1683,7 +1685,15 @@ bool read_file(const char* name, char** bytes, size_t* length)
     }
 
     // Read file contents into buffer
-    fread(buffer, fileLen, 1, file);
+    size_t ret = fread(buffer, fileLen, 1, file);
+    if (ret != 1)
+    {
+        printf("Failed to read data from file, %s\n", name);
+        fclose(file);
+        free(buffer);
+        return false;
+    }
+
     fclose(file);
 
     LOGI("file bytes: %s", buffer);
index 1f6b02b..21d1d17 100644 (file)
@@ -135,28 +135,25 @@ CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
     if (!info)
     {
         OIC_LOG(ERROR, TAG, "endpoint info is null");
-        return CA_STATUS_FAILED;
+        return CA_STATUS_INVALID_PARAM;
     }
 
-    int32_t netInfoSize = 1;
-
     char *macAddress = NULL;
     CAResult_t ret = CAEDRGetInterfaceInfo(&macAddress);
-    OIC_LOG_V(ERROR, TAG, "address : %s", macAddress);
-    if (NULL == macAddress)
-    {
-        OIC_LOG(ERROR, TAG, "mac address is null");
-
-        return CA_STATUS_FAILED;
-    }
     if (CA_STATUS_OK != ret)
     {
         OIC_LOG_V(ERROR, TAG, "Failed to get interface info [%d]", ret);
-
         OICFree(macAddress);
         return ret;
     }
 
+    if (!macAddress)
+    {
+        OIC_LOG(ERROR, TAG, "mac address is null");
+        return CA_STATUS_FAILED;
+    }
+    OIC_LOG_V(DEBUG, TAG, "address : %s", macAddress);
+
     // Create local endpoint using util function
     CAEndpoint_t *endpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS, CA_ADAPTER_RFCOMM_BTEDR,
                                                     macAddress, 0);
@@ -168,6 +165,7 @@ CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
     }
 
     // copy unicast server information
+    int32_t netInfoSize = 1;
     CAEndpoint_t *netInfo = (CAEndpoint_t *)OICMalloc(sizeof(CAEndpoint_t) * netInfoSize);
     if (NULL == netInfo)
     {
@@ -193,7 +191,7 @@ void CAEDRClientTerminate()
     OIC_LOG(DEBUG, TAG, "OUT");
 }
 
-CAResult_t CAEDRManagerReadData(void)
+CAResult_t CAEDRManagerReadData()
 {
     OIC_LOG(DEBUG, TAG, "IN");
 
@@ -204,6 +202,8 @@ CAResult_t CAEDRManagerReadData(void)
 CAResult_t CAEDRClientSendUnicastData(const char *remoteAddress, const uint8_t *data,
                                       uint32_t dataLength)
 {
+    VERIFY_NON_NULL(remoteAddress, TAG, "remoteAddress is null");
+    VERIFY_NON_NULL(data, TAG, "data is null");
     OIC_LOG(DEBUG, TAG, "IN");
 
     CAResult_t result = CAEDRSendUnicastMessage(remoteAddress, data, dataLength);
@@ -213,6 +213,7 @@ CAResult_t CAEDRClientSendUnicastData(const char *remoteAddress, const uint8_t *
 
 CAResult_t CAEDRClientSendMulticastData(const uint8_t *data, uint32_t dataLength)
 {
+    VERIFY_NON_NULL(data, TAG, "data is null");
     OIC_LOG(DEBUG, TAG, "IN");
 
     CAResult_t result = CAEDRSendMulticastMessage(data, dataLength);
@@ -221,7 +222,7 @@ CAResult_t CAEDRClientSendMulticastData(const uint8_t *data, uint32_t dataLength
 }
 
 // It will be updated when android EDR support is added
-void CAEDRClientUnsetCallbacks(void)
+void CAEDRClientUnsetCallbacks()
 {
     OIC_LOG(DEBUG, TAG, "IN");
 
@@ -229,7 +230,7 @@ void CAEDRClientUnsetCallbacks(void)
 }
 
 // It will be updated when android EDR support is added
-void CAEDRClientDisconnectAll(void)
+void CAEDRClientDisconnectAll()
 {
     OIC_LOG(DEBUG, TAG, "IN");
 
@@ -516,7 +517,8 @@ void CAEDRCoreJniInit()
 
 CAResult_t CAEDRSendUnicastMessage(const char* address, const uint8_t* data, uint32_t dataLen)
 {
-    OIC_LOG_V(DEBUG, TAG, "CAEDRSendUnicastMessage(%s, %s)", address, data);
+    VERIFY_NON_NULL(address, TAG, "address is null");
+    VERIFY_NON_NULL(data, TAG, "data is null");
 
     CAResult_t result = CAEDRSendUnicastMessageImpl(address, data, dataLen);
     return result;
@@ -524,6 +526,7 @@ CAResult_t CAEDRSendUnicastMessage(const char* address, const uint8_t* data, uin
 
 CAResult_t CAEDRSendMulticastMessage(const uint8_t* data, uint32_t dataLen)
 {
+    VERIFY_NON_NULL(data, TAG, "data is null");
     OIC_LOG_V(DEBUG, TAG, "CAEDRSendMulticastMessage(%s)", data);
 
     bool isAttached = false;
@@ -613,6 +616,8 @@ void CAEDRGetLocalAddress(char **address)
 
 CAResult_t CAEDRSendUnicastMessageImpl(const char* address, const uint8_t* data, uint32_t dataLen)
 {
+    VERIFY_NON_NULL(address, TAG, "address is null");
+    VERIFY_NON_NULL(data, TAG, "data is null");
     OIC_LOG_V(DEBUG, TAG, "CAEDRSendUnicastMessageImpl, address: %s, data: %s", address, data);
 
     bool isAttached = false;
@@ -669,9 +674,6 @@ CAResult_t CAEDRSendUnicastMessageImpl(const char* address, const uint8_t* data,
 
         jstring j_str_address = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getAddress);
         const char * remoteAddress = (*env)->GetStringUTFChars(env, j_str_address, NULL);
-        OIC_LOG_V(DEBUG, TAG,
-                  "[EDR][Native] getBondedDevices: ~~device address is %s", remoteAddress);
-
         if (!remoteAddress)
         {
             OIC_LOG(ERROR, TAG, "[EDR][Native] remoteAddress is null");
@@ -686,20 +688,9 @@ CAResult_t CAEDRSendUnicastMessageImpl(const char* address, const uint8_t* data,
             (*env)->DeleteLocalRef(env, jni_cid_BTDevice);
             return CA_STATUS_INVALID_PARAM;
         }
-        if (!address)
-        {
-            OIC_LOG(ERROR, TAG, "[EDR][Native] address is null");
-            if (isAttached)
-            {
-                (*g_jvm)->DetachCurrentThread(g_jvm);
-            }
-            (*env)->ReleaseStringUTFChars(env, j_str_address, remoteAddress);
-            (*env)->DeleteLocalRef(env, j_str_address);
-            (*env)->DeleteLocalRef(env, j_obj_device);
-            (*env)->DeleteLocalRef(env, jni_arrayPairedDevices);
-            (*env)->DeleteLocalRef(env, jni_cid_BTDevice);
-            return CA_STATUS_INVALID_PARAM;
-        }
+        OIC_LOG_V(DEBUG, TAG,
+                  "[EDR][Native] getBondedDevices: ~~device address is %s", remoteAddress);
+
         // find address
         if (!strcmp(remoteAddress, address))
         {
@@ -732,6 +723,7 @@ CAResult_t CAEDRSendUnicastMessageImpl(const char* address, const uint8_t* data,
 
 CAResult_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const uint8_t* data, uint32_t dataLen)
 {
+    VERIFY_NON_NULL(data, TAG, "data is null");
     OIC_LOG_V(DEBUG, TAG, "CASendMulticastMessageImpl, send to, data: %s, %d", data, dataLen);
 
     // get bonded device list
@@ -794,6 +786,8 @@ CAResult_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const uint8_t* data, uint3
 CAResult_t CAEDRNativeSendData(JNIEnv *env, const char *address, const uint8_t *data,
                                uint32_t dataLength)
 {
+    VERIFY_NON_NULL(address, TAG, "address is null");
+    VERIFY_NON_NULL(data, TAG, "data is null");
     OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btSendData logic start : %s, %d", data, dataLength);
 
     if (!CAEDRNativeIsEnableBTAdapter(env))
@@ -807,18 +801,10 @@ CAResult_t CAEDRNativeSendData(JNIEnv *env, const char *address, const uint8_t *
         // connect before send data
         OIC_LOG(DEBUG, TAG, "[EDR][Native] connect before send data");
 
-        if (NULL == address)
-        {
-            OIC_LOG(ERROR, TAG, "[EDR][Native] remote address is empty");
-            return CA_STATUS_INVALID_PARAM;
-        }
-        else
+        CAResult_t res = CAEDRNativeConnect(env, address);
+        if (CA_STATUS_OK != res)
         {
-            CAResult_t res = CAEDRNativeConnect(env, address);
-            if (CA_STATUS_OK != res)
-            {
-                return res;
-            }
+            return res;
         }
     }
 
@@ -884,8 +870,7 @@ CAResult_t CAEDRNativeSendData(JNIEnv *env, const char *address, const uint8_t *
                 return CA_STATUS_FAILED;
             }
 
-            jbyteArray jbuf;
-            jbuf = (*env)->NewByteArray(env, dataLength);
+            jbyteArray jbuf = (*env)->NewByteArray(env, dataLength);
             (*env)->SetByteArrayRegion(env, jbuf, 0, dataLength, (jbyte*) data);
 
             (*env)->CallVoidMethod(env, jni_obj_outputStream, jni_mid_write, jbuf, (jint) 0,
@@ -924,6 +909,7 @@ CAResult_t CAEDRNativeSendData(JNIEnv *env, const char *address, const uint8_t *
 
 CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
 {
+    VERIFY_NON_NULL(address, TAG, "address is null");
     OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect..");
 
     if (!CAEDRNativeIsEnableBTAdapter(env))
@@ -1080,6 +1066,7 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
 
 void CAEDRNativeSocketClose(JNIEnv *env, const char *address)
 {
+    VERIFY_NON_NULL_VOID(address, TAG, "address is null");
 
     jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
     if (!jni_cid_BTSocket)
index 0a1055f..14fca1e 100644 (file)
@@ -128,6 +128,7 @@ Java_org_iotivity_ca_CaEdrInterface_caEdrStateChangedCallback(JNIEnv *env, jobje
     if (NULL == g_networkChangeCb)
     {
         OIC_LOG_V(DEBUG, TAG, "gNetworkChangeCb is null", status);
+        return;
     }
 
     jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
index d5fee43..de09553 100644 (file)
@@ -231,16 +231,6 @@ static void CAAcceptHandler(void *data)
 
     CAAdapterAcceptThreadContext_t *ctx = (CAAdapterAcceptThreadContext_t *) data;
 
-    if (NULL == ctx)
-    {
-        OIC_LOG(ERROR, TAG, "[EDR] AcceptThread: ctx is null");
-        if (isAttached)
-        {
-            (*g_jvm)->DetachCurrentThread(g_jvm);
-        }
-        return;
-    }
-
     // it should be initialized for restart accept thread
     ca_mutex_lock(g_mutexAcceptServer);
     g_stopAccept = false;
@@ -767,17 +757,17 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t t
                                                                "()Ljava/io/InputStream;");
         OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData:  get InputStream..%d, %s", id, address);
 
-        if (!jni_obj_socket)
+        jobject jni_obj_inputStream = (*env)->CallObjectMethod(env, jni_obj_socket,
+                                                               jni_mid_getInputStream);
+        if (!jni_obj_inputStream)
         {
             (*env)->DeleteLocalRef(env, jni_cid_BTsocket);
             (*env)->DeleteLocalRef(env, jni_str_address);
 
-            OIC_LOG(ERROR, TAG, "[EDR][Native] jni_obj_socket is not available anymore..");
+            OIC_LOG(ERROR, TAG, "[EDR] btReadData: jni_obj_inputStream is null");
             return CA_STATUS_FAILED;
         }
 
-        jobject jni_obj_inputStream = (*env)->CallObjectMethod(env, jni_obj_socket,
-                                                               jni_mid_getInputStream);
         OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData:  ready inputStream..");
 
         jclass jni_cid_InputStream = (*env)->FindClass(env, "java/io/InputStream");
@@ -794,17 +784,6 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t t
 
         jbyteArray jbuf = (*env)->NewByteArray(env, MAX_PDU_BUFFER);
 
-        if (!jni_obj_socket)
-        {
-            (*env)->DeleteLocalRef(env, jni_cid_InputStream);
-            (*env)->DeleteLocalRef(env, jni_obj_inputStream);
-            (*env)->DeleteLocalRef(env, jni_cid_BTsocket);
-            (*env)->DeleteLocalRef(env, jni_str_address);
-
-            OIC_LOG(ERROR, TAG, "[EDR][Native] jni_obj_socket is not available anymore...");
-            return CA_STATUS_FAILED;
-        }
-
         ca_mutex_lock(g_mutexInputStream);
         if (!g_inputStream)
         {
@@ -985,9 +964,9 @@ jobject CAEDRNativeListen(JNIEnv *env)
     jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter,
                                                                     "getDefaultAdapter",
                                                                     METHODID_OBJECTNONPARAM);
-    if (!jni_cid_BTAdapter)
+    if (!jni_mid_getDefaultAdapter)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] btListen: jni_cid_BTAdapter is null");
+        OIC_LOG(ERROR, TAG, "[EDR][Native] btListen: jni_mid_getDefaultAdapter is null");
         return NULL;
     }
 
@@ -1167,4 +1146,3 @@ void CAEDRNatvieCloseServerTask(JNIEnv* env)
         OIC_LOG(DEBUG, TAG, "[EDR][Native] close accept obj");
     }
 }
-
index c9c6a9b..83dfd70 100644 (file)
@@ -221,6 +221,7 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeStateChangedCallback(JNIEnv *env, j
     if (!gCALEDeviceStateChangedCallback)
     {
         OIC_LOG_V(ERROR, TAG, "gNetworkChangeCb is null", status);
+        return;
     }
 
     if (BT_STATE_ON == status) // STATE_ON:12
index 916b94f..687cadf 100644 (file)
@@ -174,7 +174,7 @@ jobject CALEServerSetResponseData(JNIEnv *env, jbyteArray responseData)
 
     jclass jni_cid_bluetoothGattCharacteristic = (*env)->FindClass(env, "android/bluetooth/"
                                                                    "BluetoothGattCharacteristic");
-    if (!jni_cid_bluetoothGattService)
+    if (!jni_cid_bluetoothGattCharacteristic)
     {
         OIC_LOG(ERROR, TAG, "jni_cid_bluetoothGattCharacteristic is null");
         return NULL;
@@ -184,7 +184,7 @@ jobject CALEServerSetResponseData(JNIEnv *env, jbyteArray responseData)
                                                        "getService",
                                                        "(Ljava/util/UUID;)Landroid/bluetooth/"
                                                        "BluetoothGattService;");
-    if (!jni_cid_bluetoothGattService)
+    if (!jni_mid_getService)
     {
         OIC_LOG(ERROR, TAG, "jni_mid_getService is null");
         return NULL;
@@ -682,9 +682,9 @@ CAResult_t CALEServerStopAdvertise(JNIEnv *env, jobject advertiseCallback)
                                                                     "getDefaultAdapter",
                                                                     "()Landroid/bluetooth/"
                                                                     "BluetoothAdapter;");
-    if (!jni_cid_leAdvertiser)
+    if (!jni_mid_getDefaultAdapter)
     {
-        OIC_LOG(ERROR, TAG, "jni_cid_leAdvertiser is null");
+        OIC_LOG(ERROR, TAG, "jni_mid_getDefaultAdapter is null");
         return CA_STATUS_FAILED;
     }