Fix issue where adv_handle of incorrect instance was modified 00/302600/2 accepted/tizen/7.0/unified/20231212.115255
authorWootak Jung <wootak.jung@samsung.com>
Mon, 11 Dec 2023 06:05:14 +0000 (15:05 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Mon, 11 Dec 2023 06:26:56 +0000 (15:26 +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 7765511..76aa0ed 100644 (file)
@@ -1336,7 +1336,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;
 }
@@ -1406,7 +1406,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
@@ -1755,7 +1755,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;
 }
@@ -1890,7 +1890,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 fb52824..c0a2c89 100644 (file)
@@ -551,10 +551,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++) {
@@ -563,7 +564,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 a7b93ee..4140b4e 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);