summaryrefslogtreecommitdiffstats
path: root/jni
diff options
context:
space:
mode:
authorAndre Eisenbach <eisenbach@google.com>2014-08-28 18:36:28 -0700
committerAndre Eisenbach <eisenbach@google.com>2014-08-29 12:14:43 -0700
commit717be4e8209e4c24d8a1e395f65f86aee5bb0e69 (patch)
tree5660aa5a5e6b0389d2f6159d5b7923a0456f50bf /jni
parent76b4771991363ff69a099f483362805e4df63836 (diff)
downloadandroid_packages_apps_Bluetooth-717be4e8209e4c24d8a1e395f65f86aee5bb0e69.tar.gz
android_packages_apps_Bluetooth-717be4e8209e4c24d8a1e395f65f86aee5bb0e69.tar.bz2
android_packages_apps_Bluetooth-717be4e8209e4c24d8a1e395f65f86aee5bb0e69.zip
Protect against Bluetooth share crash because of invalid timer callback
If the timer callback is not set when fired, a SIGSEGV will ensue. This patch checks to make sure the callback is set before invoking the function. Bug: 17307367 Change-Id: I2ee284bdbd3b54a368e373d9ac9e6e47205dcff6
Diffstat (limited to 'jni')
-rw-r--r--jni/com_android_bluetooth_btservice_AdapterService.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/jni/com_android_bluetooth_btservice_AdapterService.cpp b/jni/com_android_bluetooth_btservice_AdapterService.cpp
index decb024f1..ea765b53a 100644
--- a/jni/com_android_bluetooth_btservice_AdapterService.cpp
+++ b/jni/com_android_bluetooth_btservice_AdapterService.cpp
@@ -507,11 +507,14 @@ static bool set_wake_alarm_callout(uint64_t delay_millis, bool should_wake, alar
return false;
}
+ sAlarmCallback = cb;
+ sAlarmCallbackData = data;
+
jboolean jshould_wake = should_wake ? JNI_TRUE : JNI_FALSE;
jboolean ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_setWakeAlarm, (jlong)delay_millis, jshould_wake);
- if (ret) {
- sAlarmCallback = cb;
- sAlarmCallbackData = data;
+ if (!ret) {
+ sAlarmCallback = NULL;
+ sAlarmCallbackData = NULL;
}
if (status == JNI_EDETACHED) {
@@ -586,7 +589,11 @@ static int release_wake_lock_callout(const char *lock_name) {
// Called by Java code when alarm is fired. A wake lock is held by the caller
// over the duration of this callback.
static void alarmFiredNative(JNIEnv *env, jobject obj) {
- sAlarmCallback(sAlarmCallbackData);
+ if (sAlarmCallback) {
+ sAlarmCallback(sAlarmCallbackData);
+ } else {
+ ALOGE("%s() - Alarm fired with callback not set!", __FUNCTION__);
+ }
}
static void remote_mas_instances_callback(bt_status_t status, bt_bdaddr_t *bd_addr,