Fix issue where wrong manager_id was unregistered 29/309829/1 tizen
authorWootak Jung <wootak.jung@samsung.com>
Tue, 26 Mar 2024 06:18:38 +0000 (15:18 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Wed, 17 Apr 2024 05:29:54 +0000 (14:29 +0900)
app_path and manager_id must match and be unregistered

Change-Id: Id0da7b762e25f1b77f6fb36d4ad76272141ed2ed
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
bt-oal/bluez_hal/src/bt-hal-gatt-server.c

index 5ff6c54..ce0dfc6 100644 (file)
@@ -62,7 +62,6 @@ extern const btgatt_callbacks_t *bt_gatt_callbacks;
 static guint owner_id;
 static GDBusConnection *g_conn = NULL;
 static GDBusNodeInfo *manager_node_info = NULL;
-static guint manager_id;
 
 #define GATT_HANDLE_MAX_NUM 100 /* Not defined in spec, implementation dependent */
 #define SERV_HANDLE_NUM (GATT_HANDLE_MAX_NUM)
@@ -210,8 +209,8 @@ static GSList * hal_gatts_server_register_list;
 #define BT_GATTS_MAX 11
 
 static int assigned_id = 0;
-
 static gboolean instance_id_used[BT_GATTS_MAX];
+static guint manager_id[BT_GATTS_MAX];
 
 #define CHECK_BTGATT_INIT() if (_bt_hal_gatt_interface_ready() == false)\
 {\
@@ -223,7 +222,7 @@ static gboolean instance_id_used[BT_GATTS_MAX];
 
 static gboolean __bt_hal_gatt_service_added_cb(gpointer user_data);
 
-static void __bt_hal_gatt_deinit(char *app_path);
+static void __bt_hal_gatt_deinit(int server_if);
 
 static void __bt_hal_register_application_cb(GObject *object,
                                GAsyncResult *res, gpointer user_data);
@@ -2077,7 +2076,7 @@ static void _bt_hal_remove_gatt_server_from_list(int server_if)
                                                g_slist_length(gatt_server_apps));
 
                                /* DBUS Unregister only for current app */
-                               __bt_hal_gatt_deinit(info->app_path);
+                               __bt_hal_gatt_deinit(server_if);
 
                                g_free(info->app_path);
                                g_free(info);
@@ -2367,11 +2366,10 @@ static void __bt_hal_unregister_application_cb(GObject *object, GAsyncResult *re
        g_free(app_path);
 }
 
-static void __bt_hal_gatt_deinit(char *app_path)
+static void __bt_hal_gatt_deinit(int server_if)
 {
        GDBusProxy *proxy = NULL;
-       char *data;
-       INFO("+");
+       char *app_path, *data;
 
        /* Step1: Remove requested App */
        proxy = __bt_gatt_gdbus_get_gatt_manager_proxy("org.bluez",
@@ -2380,10 +2378,11 @@ static void __bt_hal_gatt_deinit(char *app_path)
        if (proxy == NULL)
                return;
 
+       app_path = g_strdup_printf("/com/%d", server_if);
        INFO("UnregisterApplication : path [%s]", app_path);
 
        /* Async Call to Unregister Service */
-       data = g_strdup(app_path);
+       data = g_strdup_printf("/com/%d", server_if);
        g_dbus_proxy_call(proxy,
                        "UnregisterApplication",
                        g_variant_new("(o)",
@@ -2392,10 +2391,12 @@ static void __bt_hal_gatt_deinit(char *app_path)
                        NULL,
                        (GAsyncReadyCallback)__bt_hal_unregister_application_cb,
                        (gpointer)data);
+       g_free(app_path);
 
        /* unregister the exported interface for object manager */
-       g_dbus_connection_unregister_object(g_conn, manager_id);
-       manager_id = 0;
+       INFO("Unregister the interface for object with manager_id: %d", manager_id[server_if]);
+       g_dbus_connection_unregister_object(g_conn, manager_id[server_if]);
+       manager_id[server_if] = 0;
 
        /* If requested app is last GATT Server app, then clean all resources */
        if (gatt_server_apps == NULL) {
@@ -2408,7 +2409,6 @@ static void __bt_hal_gatt_deinit(char *app_path)
                        manager_gproxy = NULL;
                }
        }
-       INFO("-");
 }
 
 static int __bt_hal_gatt_init(void)
@@ -2516,17 +2516,17 @@ static bt_status_t gatt_server_add_service(int server_if, btgatt_srvc_id_t *srvc
                app_id = g_malloc0(sizeof(int));
                *app_id = server_if;
 
-               manager_id = g_dbus_connection_register_object(g_conn, app_path,
+               manager_id[server_if] = g_dbus_connection_register_object(g_conn, app_path,
                                manager_node_info->interfaces[0],
                                &manager_interface_vtable,
                                (gpointer)app_id, NULL, &error);
 
-               if (manager_id == 0) {
+               if (manager_id[server_if] == 0) {
                        ERR("failed to register: %s", error->message);
                        g_error_free(error);
                        goto failed;
                }
-               INFO("manager_id [%d]", manager_id);
+               INFO("manager_id [%d]", manager_id[server_if]);
 
                /* For current GATT Server, app_path is created, save it in Table */
                _bt_hal_update_gatt_server_path(server_if, app_path);