summaryrefslogtreecommitdiffstats
path: root/jni
diff options
context:
space:
mode:
authorAjay Kumar <ajayku@codeaurora.org>2014-08-12 21:46:51 +0530
committerLinux Build Service Account <lnxbuild@localhost>2014-11-04 08:25:51 -0700
commit3e4660385b24c4a82505cd482b54e1593802f3f0 (patch)
treef80ddc40ba582a7ddf43736e41c81c76681e214e /jni
parent0f71878ff61a5de0162b02dea9042d1c2f04a0dd (diff)
downloadandroid_packages_apps_Bluetooth-3e4660385b24c4a82505cd482b54e1593802f3f0.tar.gz
android_packages_apps_Bluetooth-3e4660385b24c4a82505cd482b54e1593802f3f0.tar.bz2
android_packages_apps_Bluetooth-3e4660385b24c4a82505cd482b54e1593802f3f0.zip
Bluetooth: Hedge against the Null global reference access
Whenever there is an error at upper layer it cleans up JNI interface as part of cleanup and global reference also get dereferenced but lower layer HAL is not aware in case of upper layer and sends the jni callback where it crashes.protecting all callbacks since expereincing similar issues at different callbacks. Change-Id: Idab75ca537e02f976e6892d7e03aa70fb7e43868 CRs-fixed: 710760
Diffstat (limited to 'jni')
-rw-r--r--jni/com_android_bluetooth_btservice_AdapterService.cpp51
1 files changed, 34 insertions, 17 deletions
diff --git a/jni/com_android_bluetooth_btservice_AdapterService.cpp b/jni/com_android_bluetooth_btservice_AdapterService.cpp
index 87ef3ae23..d6c654274 100644
--- a/jni/com_android_bluetooth_btservice_AdapterService.cpp
+++ b/jni/com_android_bluetooth_btservice_AdapterService.cpp
@@ -175,8 +175,10 @@ static void adapter_properties_callback(bt_status_t status, int num_properties,
return;
}
- callbackEnv->CallVoidMethod(sJniCallbacksObj, method_adapterPropertyChangedCallback, types,
- props);
+ if (sJniCallbacksObj) {
+ callbackEnv->CallVoidMethod(sJniCallbacksObj, method_adapterPropertyChangedCallback, types,
+ props);
+ }
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
callbackEnv->DeleteLocalRef(props);
callbackEnv->DeleteLocalRef(types);
@@ -245,8 +247,10 @@ static void remote_device_properties_callback(bt_status_t status, bt_bdaddr_t *b
return;
}
- callbackEnv->CallVoidMethod(sJniCallbacksObj, method_devicePropertyChangedCallback, addr,
- types, props);
+ if (sJniCallbacksObj) {
+ callbackEnv->CallVoidMethod(sJniCallbacksObj, method_devicePropertyChangedCallback, addr,
+ types, props);
+ }
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
callbackEnv->DeleteLocalRef(props);
callbackEnv->DeleteLocalRef(types);
@@ -287,7 +291,9 @@ static void device_found_callback(int num_properties, bt_property_t *properties)
remote_device_properties_callback(BT_STATUS_SUCCESS, (bt_bdaddr_t *)properties[addr_index].val,
num_properties, properties);
- callbackEnv->CallVoidMethod(sJniCallbacksObj, method_deviceFoundCallback, addr);
+ if (sJniCallbacksObj) {
+ callbackEnv->CallVoidMethod(sJniCallbacksObj, method_deviceFoundCallback, addr);
+ }
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
callbackEnv->DeleteLocalRef(addr);
}
@@ -311,8 +317,10 @@ static void bond_state_changed_callback(bt_status_t status, bt_bdaddr_t *bd_addr
}
callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte *)bd_addr);
- callbackEnv->CallVoidMethod(sJniCallbacksObj, method_bondStateChangeCallback, (jint) status,
- addr, (jint)state);
+ if (sJniCallbacksObj) {
+ callbackEnv->CallVoidMethod(sJniCallbacksObj, method_bondStateChangeCallback, (jint) status,
+ addr, (jint)state);
+ }
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
callbackEnv->DeleteLocalRef(addr);
}
@@ -337,8 +345,10 @@ static void acl_state_changed_callback(bt_status_t status, bt_bdaddr_t *bd_addr,
}
callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte *)bd_addr);
- callbackEnv->CallVoidMethod(sJniCallbacksObj, method_aclStateChangeCallback, (jint) status,
- addr, (jint)state);
+ if (sJniCallbacksObj) {
+ callbackEnv->CallVoidMethod(sJniCallbacksObj, method_aclStateChangeCallback, (jint) status,
+ addr, (jint)state);
+ }
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
callbackEnv->DeleteLocalRef(addr);
}
@@ -352,9 +362,10 @@ static void discovery_state_changed_callback(bt_discovery_state_t state) {
ALOGV("%s: DiscoveryState:%d ", __FUNCTION__, state);
- callbackEnv->CallVoidMethod(sJniCallbacksObj, method_discoveryStateChangeCallback,
- (jint)state);
-
+ if (sJniCallbacksObj) {
+ callbackEnv->CallVoidMethod(sJniCallbacksObj, method_discoveryStateChangeCallback,
+ (jint)state);
+ }
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
}
@@ -378,7 +389,9 @@ static void pin_request_callback(bt_bdaddr_t *bd_addr, bt_bdname_t *bdname, uint
callbackEnv->SetByteArrayRegion(devname, 0, sizeof(bt_bdname_t), (jbyte*)bdname);
- callbackEnv->CallVoidMethod(sJniCallbacksObj, method_pinRequestCallback, addr, devname, cod, secure);
+ if (sJniCallbacksObj) {
+ callbackEnv->CallVoidMethod(sJniCallbacksObj, method_pinRequestCallback, addr, devname, cod, secure);
+ }
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
callbackEnv->DeleteLocalRef(addr);
@@ -411,8 +424,10 @@ static void ssp_request_callback(bt_bdaddr_t *bd_addr, bt_bdname_t *bdname, uint
if (devname == NULL) goto Fail;
callbackEnv->SetByteArrayRegion(devname, 0, sizeof(bt_bdname_t), (jbyte*)bdname);
- callbackEnv->CallVoidMethod(sJniCallbacksObj, method_sspRequestCallback, addr, devname, cod,
- (jint) pairing_variant, pass_key);
+ if (sJniCallbacksObj) {
+ callbackEnv->CallVoidMethod(sJniCallbacksObj, method_sspRequestCallback, addr, devname, cod,
+ (jint) pairing_variant, pass_key);
+ }
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
callbackEnv->DeleteLocalRef(addr);
@@ -659,8 +674,10 @@ static void remote_mas_instances_callback(bt_status_t status, bt_bdaddr_t *bd_ad
callbackEnv->DeleteLocalRef(name);
}
- callbackEnv->CallVoidMethod(sJniCallbacksObj, method_deviceMasInstancesFoundCallback,
- (jint) status, addr, a_name, a_scn, a_masid, a_msgtype);
+ if (sJniCallbacksObj) {
+ callbackEnv->CallVoidMethod(sJniCallbacksObj, method_deviceMasInstancesFoundCallback,
+ (jint) status, addr, a_name, a_scn, a_masid, a_msgtype);
+ }
checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
clean: