Fixed android local reference overflow
authorJaehong Jo <jaehong.jo@samsung.com>
Fri, 18 Sep 2015 07:01:58 +0000 (16:01 +0900)
committerPatrick Lankswert <patrick.lankswert@intel.com>
Fri, 18 Sep 2015 15:59:35 +0000 (15:59 +0000)
Delete JNI local reference

Change-Id: I1b0b54ec775be075a3fe9e127d57fe0bc882c9a8
Signed-off-by: Jaehong Jo <jaehong.jo@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2675
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Patrick Lankswert <patrick.lankswert@intel.com>
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrutils.c

index 21d1d17..b41dfb2 100644 (file)
@@ -656,8 +656,7 @@ CAResult_t CAEDRSendUnicastMessageImpl(const char* address, const uint8_t* data,
                                                      METHODID_STRINGNONPARAM);
 
     jsize length = (*env)->GetArrayLength(env, jni_arrayPairedDevices);
-    jsize i;
-    for (i = 0; i < length; i++)
+    for (jsize i = 0; i < length; i++)
     {
         OIC_LOG(DEBUG, TAG, "[EDR][Native] start to check device");
         // get name, address from BT device
@@ -674,6 +673,7 @@ 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);
+        (*env)->DeleteLocalRef(env, j_obj_device);
         if (!remoteAddress)
         {
             OIC_LOG(ERROR, TAG, "[EDR][Native] remoteAddress is null");
@@ -683,7 +683,6 @@ CAResult_t CAEDRSendUnicastMessageImpl(const char* address, const uint8_t* data,
             }
 
             (*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;
@@ -695,19 +694,18 @@ CAResult_t CAEDRSendUnicastMessageImpl(const char* address, const uint8_t* data,
         if (!strcmp(remoteAddress, address))
         {
             CAResult_t res = CAEDRNativeSendData(env, remoteAddress, data, dataLen);
+            (*env)->ReleaseStringUTFChars(env, j_str_address, remoteAddress);
+            (*env)->DeleteLocalRef(env, j_str_address);
             if (CA_STATUS_OK != res)
             {
-                (*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 res;
             }
+            break;
         }
         (*env)->ReleaseStringUTFChars(env, j_str_address, remoteAddress);
         (*env)->DeleteLocalRef(env, j_str_address);
-        (*env)->DeleteLocalRef(env, j_obj_device);
     }
 
     (*env)->DeleteLocalRef(env, jni_arrayPairedDevices);
@@ -741,8 +739,7 @@ CAResult_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const uint8_t* data, uint3
                                                      METHODID_STRINGNONPARAM);
 
     jsize length = (*env)->GetArrayLength(env, jni_arrayPairedDevices);
-    jsize i;
-    for (i = 0; i < length; i++)
+    for (jsize i = 0; i < length; i++)
     {
         // get name, address from BT device
         jobject j_obj_device = (*env)->GetObjectArrayElement(env, jni_arrayPairedDevices, i);
@@ -758,6 +755,7 @@ CAResult_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const uint8_t* data, uint3
 
         jstring j_str_address = (*env)->CallObjectMethod(env, j_obj_device, j_mid_getAddress);
         const char * remoteAddress = (*env)->GetStringUTFChars(env, j_str_address, NULL);
+        (*env)->DeleteLocalRef(env, j_obj_device);
         OIC_LOG_V(DEBUG, TAG,
                   "[EDR][Native] getBondedDevices: ~~device address is %s", remoteAddress);
 
@@ -932,6 +930,7 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
     if (!jni_mid_getDefaultAdapter)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_mid_getDefaultAdapter is null");
+        (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
         return CA_STATUS_FAILED;
     }
 
@@ -940,6 +939,7 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
     if (!jni_obj_BTAdapter)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_obj_BTAdapter is null");
+        (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
         return CA_STATUS_FAILED;
     }
 
@@ -947,15 +947,19 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
     jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(env, jni_cid_BTAdapter,
                                                             "getRemoteDevice",
                                                             METHODID_BT_DEVICEPARAM);
+    (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
     if (!jni_mid_getRemoteDevice)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_mid_getRemoteDevice is null");
+        (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
         return CA_STATUS_FAILED;
     }
 
     jstring jni_address = (*env)->NewStringUTF(env, address);
     jobject jni_obj_remoteBTDevice = (*env)->CallObjectMethod(env, jni_obj_BTAdapter,
                                                               jni_mid_getRemoteDevice, jni_address);
+    (*env)->DeleteLocalRef(env, jni_address);
+    (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
     if (!jni_obj_remoteBTDevice)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_obj_remoteBTDevice is null");
@@ -967,15 +971,18 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
     if (!jni_cid_BluetoothDevice)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_cid_BluetoothDevice is null");
+        (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
         return CA_STATUS_FAILED;
     }
 
     jmethodID jni_mid_createSocket = (*env)->GetMethodID(
             env, jni_cid_BluetoothDevice, "createInsecureRfcommSocketToServiceRecord",
             "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;");
+    (*env)->DeleteLocalRef(env, jni_cid_BluetoothDevice);
     if (!jni_mid_createSocket)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_mid_createSocket is null");
+        (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
         return CA_STATUS_FAILED;
     }
 
@@ -984,6 +991,7 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
     if (!jni_cid_uuid)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_cid_uuid is null");
+        (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
         return CA_STATUS_FAILED;
     }
 
@@ -992,6 +1000,8 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
     if (!jni_mid_fromString)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_mid_fromString is null");
+        (*env)->DeleteLocalRef(env, jni_cid_uuid);
+        (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
         return CA_STATUS_FAILED;
     }
 
@@ -999,18 +1009,25 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
     if (!jni_uuid)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_uuid is null");
+        (*env)->DeleteLocalRef(env, jni_cid_uuid);
+        (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
         return CA_STATUS_FAILED;
     }
     jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_uuid, jni_mid_fromString,
                                                           jni_uuid);
+    (*env)->DeleteLocalRef(env, jni_cid_uuid);
+    (*env)->DeleteLocalRef(env, jni_uuid);
     if (!jni_obj_uuid)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_obj_uuid is null");
+        (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
         return CA_STATUS_FAILED;
     }
     // create socket
     jobject jni_obj_BTSocket = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice,
                                                         jni_mid_createSocket, jni_obj_uuid);
+    (*env)->DeleteLocalRef(env, jni_obj_uuid);
+    (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
     if (!jni_obj_BTSocket)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_obj_BTSocket is null");
@@ -1022,13 +1039,16 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
     if (!jni_cid_BTSocket)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_cid_BTSocket is null");
+        (*env)->DeleteLocalRef(env, jni_obj_BTSocket);
         return CA_STATUS_FAILED;
     }
 
     jmethodID jni_mid_connect = (*env)->GetMethodID(env, jni_cid_BTSocket, "connect", "()V");
+    (*env)->DeleteLocalRef(env, jni_cid_BTSocket);
     if (!jni_mid_connect)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_mid_connect is null");
+        (*env)->DeleteLocalRef(env, jni_obj_BTSocket);
         return CA_STATUS_FAILED;
     }
 
@@ -1048,10 +1068,13 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
     if (!jni_socket)
     {
         OIC_LOG(ERROR, TAG, "[EDR][Native] btConnect: jni_socket is null");
+        (*env)->DeleteLocalRef(env, jni_obj_BTSocket);
         return CA_STATUS_FAILED;
     }
     ca_mutex_lock(g_mutexObjectList);
     CAEDRNativeAddDeviceSocketToList(env, jni_socket);
+    (*env)->DeleteGlobalRef(env, jni_socket);
+    (*env)->DeleteLocalRef(env, jni_obj_BTSocket);
     ca_mutex_unlock(g_mutexObjectList);
 
     // update state
index 5442ed3..154ef47 100644 (file)
@@ -233,6 +233,7 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
     {
         (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
+        (*env)->DeleteLocalRef(env, jni_obj_setPairedDevices);
 
         OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: jni_cid_Set is null");
         return NULL;
@@ -244,6 +245,7 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
     {
         (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
+        (*env)->DeleteLocalRef(env, jni_obj_setPairedDevices);
 
         OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: jni_mid_toArray is null");
         return NULL;
@@ -255,6 +257,7 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
     {
         (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
+        (*env)->DeleteLocalRef(env, jni_obj_setPairedDevices);
 
         OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: jni_arrayPairedDevices is null");
         return NULL;
@@ -262,6 +265,7 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
 
     (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
     (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
+    (*env)->DeleteLocalRef(env, jni_obj_setPairedDevices);
 
     return jni_arrayPairedDevices;
 }
@@ -617,6 +621,7 @@ void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
         OIC_LOG(DEBUG, TAG, "Set Socket Object to Array");
     }
     (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress);
+    (*env)->DeleteLocalRef(env, jni_remoteAddress);
 }
 
 bool CAEDRNativeIsDeviceSocketInList(JNIEnv *env, const char* remoteAddress)
@@ -641,6 +646,7 @@ bool CAEDRNativeIsDeviceSocketInList(JNIEnv *env, const char* remoteAddress)
         }
 
         jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
+        (*env)->DeleteLocalRef(env, jarrayObj);
         if (!jni_setAddress)
         {
             OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_setAddress is null");