From 8120c94a25c6b3cb28fb2e3649880d87d1bb4ea7 Mon Sep 17 00:00:00 2001 From: Jaehong Jo Date: Fri, 18 Sep 2015 16:01:58 +0900 Subject: [PATCH] Fixed android local reference overflow Delete JNI local reference Change-Id: I1b0b54ec775be075a3fe9e127d57fe0bc882c9a8 Signed-off-by: Jaehong Jo Reviewed-on: https://gerrit.iotivity.org/gerrit/2675 Tested-by: jenkins-iotivity Reviewed-by: Patrick Lankswert --- .../src/bt_edr_adapter/android/caedrclient.c | 41 +++++++++++++++++----- .../src/bt_edr_adapter/android/caedrutils.c | 6 ++++ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c index 21d1d17..b41dfb2 100644 --- a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c +++ b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c @@ -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 diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrutils.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrutils.c index 5442ed3..154ef47 100644 --- a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrutils.c +++ b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrutils.c @@ -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"); -- 2.7.4