monitor: request-handler: Fix to delete resource properly 96/272596/1 accepted/tizen/unified/20220322.015107 submit/tizen/20220321.101126
authorDongwoo Lee <dwoo08.lee@samsung.com>
Mon, 21 Mar 2022 08:21:21 +0000 (17:21 +0900)
committerDongwoo Lee <dwoo08.lee@samsung.com>
Mon, 21 Mar 2022 08:33:58 +0000 (17:33 +0900)
Since resources are managed by hash table, it should be removed from
hash table before removing resource. Otherwise, it can cause
double-free when the client is disconnected. So, this fixes create and
remove procedures to handle hash table properly.

Change-Id: I466e5cc6c289c20cd827964aae0c191b85356938
Signed-off-by: Dongwoo Lee <dwoo08.lee@samsung.com>
src/monitor/request-handler.c

index b70f504..cd2904f 100644 (file)
 #include <sys/time.h>
 #include <assert.h>
 
-static void free_resource(gpointer key, gpointer value, gpointer user_data)
-{
-       struct resource *res = value;
-
-       delete_resource(res);
-}
-
 static void update_resource(gpointer key, gpointer value, gpointer user_data)
 {
        struct resource *res = value;
@@ -59,19 +52,16 @@ static void update_resource(gpointer key, gpointer value, gpointer user_data)
                                        res->name, res->id);
 }
 
-static void finalize_request_client(struct request_client *client)
+static void
+register_resource_to_client(struct request_client *client, struct resource *res)
 {
-       if (!client)
-               return;
-
-       if (client->resource_table)
-               g_hash_table_foreach(client->resource_table, (GHFunc)free_resource, NULL);
+       g_hash_table_insert(client->resource_table, (gpointer)&res->id, (gpointer)res);
 }
 
 static void
-register_resource_to_client(struct request_client *client, struct resource *res)
+unregister_resource_from_client(struct request_client *client, int resource_id)
 {
-       g_hash_table_insert(client->resource_table, (gpointer)&res->id, (gpointer)res);
+       g_hash_table_remove(client->resource_table, (gpointer)&resource_id);
 }
 
 static struct resource *
@@ -109,7 +99,6 @@ static int handle_request_create_resource(struct request_client *client, char *a
 
 static int handle_request_delete_resource(struct request_client *client, char *args)
 {
-       struct resource *res;
        int resource_id;
 
        if (!client || !args)
@@ -121,11 +110,7 @@ static int handle_request_delete_resource(struct request_client *client, char *a
         */
        resource_id = atoi(args);
 
-       res = get_resource_by_id(client, resource_id);
-       if (!res)
-               return -EINVAL;
-
-       delete_resource(res);
+       unregister_resource_from_client(client, resource_id);
 
        return 0;
 }
@@ -709,7 +694,7 @@ static int request_handler_func(void *data, void **result)
                handle_request(client, buffer);
        }
 out:
-       finalize_request_client(client);
+       g_hash_table_destroy(client->resource_table);
        close(client->socket_fd);
        destroy_request_client(client);
 
@@ -727,7 +712,8 @@ int create_request_client(int socket_fd)
        }
 
        client->socket_fd = socket_fd;
-       client->resource_table = g_hash_table_new(g_int_hash, g_int_equal);
+       client->resource_table = g_hash_table_new_full(g_int_hash, g_int_equal,
+                                                      NULL, delete_resource);
 
        create_daemon_thread(&client->worker, request_handler_func, client);