Fix issue where adv_handle of incorrect instance was modified 72/302672/1 accepted/tizen/unified/20231219.160420 accepted/tizen/unified/riscv/20231226.210826
authorWootak Jung <wootak.jung@samsung.com>
Mon, 11 Dec 2023 06:05:14 +0000 (15:05 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Tue, 12 Dec 2023 01:54:52 +0000 (10:54 +0900)
Reproduction steps:
1) bt_adapter_le_create_advertiser()     // ADV 1 create
2) bt_adapter_le_start_advertising_new() // ADV 1 start
3) bt_adapter_le_create_advertiser()     // ADV 2 create
4) bt_adapter_le_start_advertising_new() // ADV 2 start
5) register GATT Service                 // register gatt service
6) bt_gatt_server_start()                // GATT Server Start
7) bt_adapter_le_stop_advertising()      // ADV 1 stop
8) bt_adapter_le_destroy_advertiser()    // ADV 1 destroy --> RESOURCE_BUSY

Change-Id: I3ce3847b4a4acb478869c66fda8ce55e0dcdf212
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
bt-service/services/adapter/bt-service-core-adapter-le.c
bt-service/services/gatt/bt-service-gatt.c
bt-service/services/include/bt-service-gatt.h

index ac75e46f9f0b2c5cc70c119c88e5e8a633468d75..4055e7e8d6597078e23e36c9e4b787ccd33d64e3 100644 (file)
@@ -1393,7 +1393,7 @@ int _bt_set_advertising(const char *sender, int adv_handle, gboolean enable, gbo
        }
 
        /* Update adv handle in table */
-       _bt_update_adv_handle(sender, adv_handle);
+       _bt_update_adv_handle(sender, server_instance, adv_handle);
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1464,7 +1464,7 @@ int _bt_set_custom_advertising(const char *sender, int adv_handle,
                        return _bt_convert_oal_status_to_bt_error(result);
                }
                /* Update adv handle in table */
-               _bt_update_adv_handle(sender, adv_handle);
+               _bt_update_adv_handle(sender, server_instance, adv_handle);
 
                return BLUETOOTH_ERROR_NONE;
        } else
@@ -1820,7 +1820,7 @@ int _bt_set_advertising_data(const char *sender, int adv_handle,
                g_free(adv_setup.solicit_uuid);
 
        /* Update adv handle in table */
-       _bt_update_adv_handle(sender, adv_handle);
+       _bt_update_adv_handle(sender, server_instance, adv_handle);
 
        return BLUETOOTH_ERROR_NONE;
 }
@@ -1955,7 +1955,7 @@ int _bt_set_scan_response_data(const char *sender, int adv_handle,
                g_free(adv_setup.solicit_uuid);
 
        /* Update adv handle in table */
-       _bt_update_adv_handle(sender, adv_handle);
+       _bt_update_adv_handle(sender, server_instance, adv_handle);
        return BLUETOOTH_ERROR_NONE;
 }
 
index e01409d43e3cb1285c36defbc6fbd7cf48a310d2..37a02ac91c1bcc925c6eeff862745898102cf50d 100644 (file)
@@ -548,10 +548,11 @@ void _bt_gatt_deinit(void)
        __bt_service_reset_gatt_data();
 }
 
-void _bt_update_adv_handle(const char *sender, int adv_handle)
+/* NOTE: Not sure this function is really needed or not */
+void _bt_update_adv_handle(const char *sender, int instance_id, int adv_handle)
 {
        int k;
-       BT_DBG("Sender [%s] Adv handle [%d]", sender, adv_handle);
+       BT_DBG("Sender [%s] Instance Id [%d] Adv handle [%d]", sender, instance_id, adv_handle);
        bt_service_app_info_t *info = NULL;
 
        for (k = 1; k < MAX_APPS_SUPPORTED; k++) {
@@ -560,7 +561,7 @@ void _bt_update_adv_handle(const char *sender, int adv_handle)
                if (info->instance_id == -1)
                        continue;
                /* Search for a app which has same sender and adv handle as 0 */
-               if (!g_strcmp0(info->sender, sender) && info->adv_handle == 0)
+               if (!g_strcmp0(info->sender, sender) && info->instance_id == instance_id && info->adv_handle == 0)
                        info->adv_handle = adv_handle;
        }
 }
index 541c95fa3bd9fb7b67ab7129f10f713747dd7f65..eeca86e83b5bdea75e2ad5ada07acd40a9d4763a 100644 (file)
@@ -52,7 +52,7 @@ void _bt_set_new_scan_rsp_data(bluetooth_scan_resp_data_t *scan, int len, int in
 
 void _bt_set_new_adv_data(bluetooth_advertising_data_t *adv, int len, int instance);
 
-void _bt_update_adv_handle(const char *sender, int adv_handle);
+void _bt_update_adv_handle(const char *sender, int instance_id, int adv_handle);
 
 void _bt_get_previous_adv_data(bluetooth_advertising_data_t *adv, int *len, int instance);