Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66668acd authored by Ayan Ghosh's avatar Ayan Ghosh Committed by Gerrit - the friendly Code Review server
Browse files

Fix to avoid JNI crashes

For quick BT turn on/off cases there may be instances
where callback from btif is triggered even before
callback object is created or cleanup path may clear
callback object just before stray btif callback call
tries to access the same. These checks will help
prevent those unwanted crashes.

Change-Id: I9b793ed1d703ac616ed357694a365986707ee376
parent f7699509
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -58,10 +58,15 @@ static void bta2dp_connection_state_callback(btav_connection_state_t state, bt_b

    ALOGI("%s", __FUNCTION__);

    if (mCallbacksObj == NULL) {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
        return;
    }
    if (!checkCallbackThread()) {                                       \
        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
        return;                                                         \
    }

    addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
    if (!addr) {
        ALOGE("Fail to new jbyteArray bd addr for connection state");
@@ -81,6 +86,10 @@ static void bta2dp_audio_state_callback(btav_audio_state_t state, bt_bdaddr_t* b

    ALOGI("%s", __FUNCTION__);

    if (mCallbacksObj == NULL) {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
        return;
    }
    if (!checkCallbackThread()) {                                       \
        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
        return;                                                         \
@@ -104,6 +113,10 @@ static void bta2dp_connection_priority_callback(bt_bdaddr_t* bd_addr) {

    ALOGI("%s", __FUNCTION__);

    if (mCallbacksObj == NULL) {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
        return;
    }
    if (!checkCallbackThread()) {                                       \
        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
        return;                                                         \
@@ -125,6 +138,10 @@ static void bta2dp_multicast_enabled_callback(int state) {

    ALOGI("%s", __FUNCTION__);

    if (mCallbacksObj == NULL) {
        ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
        return;
    }
    if (!checkCallbackThread()) {                                       \
        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
        return;                                                         \
@@ -213,14 +230,20 @@ static void initNative(JNIEnv *env, jobject object, jint maxA2dpConnections,
        return;
    }

    mCallbacksObj = env->NewGlobalRef(object);

    if ( (status = sBluetoothA2dpInterface->init(&sBluetoothA2dpCallbacks,
            maxA2dpConnections, multiCastState)) != BT_STATUS_SUCCESS) {
        ALOGE("Failed to initialize Bluetooth A2DP, status: %d", status);
        sBluetoothA2dpInterface = NULL;
        if (mCallbacksObj != NULL) {
             ALOGW("Clean up A2DP callback object");
             env->DeleteGlobalRef(mCallbacksObj);
             mCallbacksObj = NULL;
        }
        return;
    }

    mCallbacksObj = env->NewGlobalRef(object);
}

static void cleanupNative(JNIEnv *env, jobject object) {