util: resource: Assign an unique resource id when a new resouce is created
authorSung-hun Kim <sfoon.kim@samsung.com>
Mon, 25 Jul 2022 05:45:59 +0000 (14:45 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Wed, 27 Jul 2022 08:24:26 +0000 (17:24 +0900)
When PASS-daemon restarted unexpectedly, a pass client which is
survived in spite of PASS-daemon's restart can access resources
by using its own resource id (which is valid for previous PASS
daemon).

To prevent this situation, PASS should assign a unique resource
id for each created resource even if PASS daemon is restarted.
To this end, PASS initializes a global resource id (g_resource_id)
by using the value of gettimeofday(). So, each resource will be
assigned time-reflected resource id, and uniqueness is ensured
unless the number of created resources crosses the time consumed
before restarted.

Change-Id: I0e30addf01a0ee21b1f18aca56010d39d2c90c99
Signed-off-by: Sung-hun Kim <sfoon.kim@samsung.com>
include/util/resource.h
src/monitor/request-server.c
src/util/resource.c

index 2569ccb..95cd10b 100644 (file)
@@ -175,6 +175,7 @@ void *get_resource_privdata(struct resource *resource);
 int get_resource_id(struct resource *resource);
 int get_resource_type(struct resource *resource);
 int get_resource_ts(struct resource *resource, int64_t *ts_start, int64_t *ts_end);
+void init_resource_id(void);
 
 int set_resource_privdata(struct resource *resource, void *priv);
 
index c1bf04a..8a221c5 100644 (file)
@@ -59,6 +59,8 @@ static int request_server_func(void *ctx, void **result)
        if (!g_request_server_run)
                return THREAD_RETURN_DONE;
 
+       init_resource_id();
+
        /* 0. initialize server socket */
        server_socket = socket(AF_INET, SOCK_STREAM, 0);
        if (server_socket < 0) {
index 0e4f9bb..a6fc0b8 100644 (file)
@@ -19,6 +19,7 @@
 #include <glib.h>
 #include <stdio.h>
 #include <json.h>
+#include <sys/time.h>
 
 #include <util/common.h>
 #include <util/resource.h>
@@ -178,6 +179,34 @@ void delete_resource(struct resource *resource)
        do_delete_resource(resource);
 }
 
+static int clear_sign_bit(unsigned int val)
+{
+       return (int)((val << 1) >> 1);
+}
+
+void init_resource_id(void)
+{
+       int val;
+       struct timeval tv;
+
+       /*
+        * Initial g_resource_id is set by a combination of
+        * tv_sec and tv_usec values of gettimeofday().
+        * It ensures that PASS assigns a unique resource id
+        * for each create_resource request.
+        *
+        * Even PASS is restarted, a newly initialized value
+        * of g_resource_id reflects the current value of
+        * gettimeofday(). Thus, the uniqueness in resource
+        * id is kept unless the number of created resources
+        * crosses the time consumed (in msecs) before
+        * restarted.
+        */
+       gettimeofday(&tv, NULL);
+       val = tv.tv_sec * 1000 + tv.tv_usec / 1000;
+       g_resource_id = clear_sign_bit(val);
+}
+
 struct resource *create_resource(int resource_type)
 {
        const struct resource_driver *driver = NULL;
@@ -195,7 +224,8 @@ struct resource *create_resource(int resource_type)
        if (!resource)
                return NULL;
 
-       resource->id = __sync_fetch_and_add(&g_resource_id, 1);
+       resource->id = clear_sign_bit(
+                       (unsigned int)__sync_fetch_and_add(&g_resource_id, 1));
        resource->type = resource_type;
        resource->name = g_strdup(driver->name);
        resource->driver = driver;