From 53378899efe456456c8ea9038df00794e6999787 Mon Sep 17 00:00:00 2001 From: jihwanseo Date: Wed, 16 Sep 2015 20:55:46 +0900 Subject: [PATCH] fixed the prevent issues for CA android platform. -remove the logically dead code -memory leak -dereferencing null pointer Change-Id: Ided9d1fc0a909f10309df47e23b04d7f1ca8db22 Signed-off-by: hyuna0213.jo Signed-off-by: jihwan.seo Reviewed-on: https://gerrit.iotivity.org/gerrit/2591 Tested-by: jenkins-iotivity Reviewed-by: Jaehong Jo Reviewed-by: Patrick Lankswert --- .../sampleService/src/main/jni/ResourceModel.c | 12 +++- .../src/bt_edr_adapter/android/caedrclient.c | 77 +++++++++------------- .../src/bt_edr_adapter/android/caedrnwmonitor.c | 1 + .../src/bt_edr_adapter/android/caedrserver.c | 34 ++-------- .../src/bt_le_adapter/android/calenwmonitor.c | 1 + .../src/bt_le_adapter/android/caleserver.c | 8 +-- 6 files changed, 55 insertions(+), 78 deletions(-) diff --git a/resource/csdk/connectivity/samples/android/casample/sampleService/src/main/jni/ResourceModel.c b/resource/csdk/connectivity/samples/android/casample/sampleService/src/main/jni/ResourceModel.c index 4ac7f96..0c62fff 100644 --- a/resource/csdk/connectivity/samples/android/casample/sampleService/src/main/jni/ResourceModel.c +++ b/resource/csdk/connectivity/samples/android/casample/sampleService/src/main/jni/ResourceModel.c @@ -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); 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 1f6b02b..21d1d17 100644 --- a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c +++ b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c @@ -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) diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrnwmonitor.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrnwmonitor.c index 0a1055f..14fca1e 100644 --- a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrnwmonitor.c +++ b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrnwmonitor.c @@ -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); diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c index d5fee43..de09553 100644 --- a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c +++ b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c @@ -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"); } } - diff --git a/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c b/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c index c9c6a9b..83dfd70 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c @@ -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 diff --git a/resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c b/resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c index 916b94f..687cadf 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c @@ -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; } -- 2.7.4