util: request: Use different size of buffer along with request type 15/272915/5
authorDongwoo Lee <dwoo08.lee@samsung.com>
Fri, 25 Mar 2022 02:08:33 +0000 (11:08 +0900)
committerDongwoo Lee <dwoo08.lee@samsung.com>
Tue, 29 Mar 2022 02:43:28 +0000 (11:43 +0900)
To exchange large size of array, size of response for array request
should be distingushed by others. So, instead of static buffer, nowa
buffer of response is dynamically allocated along with request type.

Change-Id: I845fe444c3736ee2fef8ea99482ede6d48262b3f
Signed-off-by: Dongwoo Lee <dwoo08.lee@samsung.com>
include/util/request-handler.h
include/util/request.h
lib/tmonitor/tmonitor.c
src/monitor/request-handler.c

index d4e2a5f..68355ce 100644 (file)
@@ -30,8 +30,6 @@ struct request_client {
        GHashTable *resource_table;
 };
 
-#define REQUEST_BUFFER_MAX 1000
-
 int create_request_client(int socket_fd);
 
 #endif /* __REQUEST_HANDLER_H__ */
index f9316a6..beefa42 100644 (file)
@@ -18,6 +18,8 @@
 #ifndef __REQUEST_H__
 #define __REQUEST_H__
 
+#define GENERIC_BUFF_MAX               (1024)
+#define ARRAY_BUFF_MAX                 (64 * 1024)
 /*
  * request format
  * REQUEST_TYPE:REQUEST_CONTENT(if required)
index d53c655..d671adf 100644 (file)
@@ -51,8 +51,6 @@ struct tmonitor_client {
        void *user_data;
 };
 
-#define MAX_BUF_SIZE 1024
-
 static GList *g_tmonitor_client_head;
 static GMutex g_mutex;
 
@@ -96,7 +94,7 @@ static struct tmonitor_client *find_client_by_id(int id)
 
 static int handle_resource_attr(int request, int id, int resource_id, u_int64_t attr_mask)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -109,7 +107,7 @@ static int handle_resource_attr(int request, int id, int resource_id, u_int64_t
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -194,7 +192,7 @@ int tmonitor_exit(int id)
 EXPORT
 int tmonitor_get_resource_count(int id, int resource_type)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -207,7 +205,7 @@ int tmonitor_get_resource_count(int id, int resource_type)
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -228,7 +226,7 @@ int tmonitor_get_resource_count(int id, int resource_type)
 EXPORT
 int tmonitor_create_resource(int id, int resource_type)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -240,7 +238,7 @@ int tmonitor_create_resource(int id, int resource_type)
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -261,7 +259,7 @@ int tmonitor_create_resource(int id, int resource_type)
 EXPORT
 int tmonitor_delete_resource(int id, int resource_id)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -273,7 +271,7 @@ int tmonitor_delete_resource(int id, int resource_id)
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -294,7 +292,7 @@ int tmonitor_delete_resource(int id, int resource_id)
 EXPORT
 int tmonitor_set_resource_ctrl(int id, int resource_id, u_int64_t ctrl_id, int value)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -307,7 +305,7 @@ int tmonitor_set_resource_ctrl(int id, int resource_id, u_int64_t ctrl_id, int v
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -340,7 +338,7 @@ int tmonitor_unset_resource_attr(int id, int resource_id, u_int64_t attr_mask)
 EXPORT
 bool tmonitor_is_resource_attr_supported(int id, int resource_id, u_int64_t attr_id)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -353,7 +351,7 @@ bool tmonitor_is_resource_attr_supported(int id, int resource_id, u_int64_t attr
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -374,7 +372,7 @@ bool tmonitor_is_resource_attr_supported(int id, int resource_id, u_int64_t attr
 EXPORT
 int tmonitor_update(int id)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -386,7 +384,7 @@ int tmonitor_update(int id)
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -407,7 +405,7 @@ int tmonitor_update(int id)
 EXPORT
 int tmonitor_update_resource(int id, int resource_id)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -419,7 +417,7 @@ int tmonitor_update_resource(int id, int resource_id)
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -440,7 +438,7 @@ int tmonitor_update_resource(int id, int resource_id)
 EXPORT
 int tmonitor_get_value_int(int id, int resource_id, u_int64_t attr_id, int32_t *value)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -453,7 +451,7 @@ int tmonitor_get_value_int(int id, int resource_id, u_int64_t attr_id, int32_t *
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -474,7 +472,7 @@ int tmonitor_get_value_int(int id, int resource_id, u_int64_t attr_id, int32_t *
 EXPORT
 int tmonitor_get_value_int64(int id, int resource_id, u_int64_t attr_id, int64_t *value)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -487,7 +485,7 @@ int tmonitor_get_value_int64(int id, int resource_id, u_int64_t attr_id, int64_t
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -508,7 +506,7 @@ int tmonitor_get_value_int64(int id, int resource_id, u_int64_t attr_id, int64_t
 EXPORT
 int tmonitor_get_value_uint(int id, int resource_id, u_int64_t attr_id, u_int32_t *value)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -521,7 +519,7 @@ int tmonitor_get_value_uint(int id, int resource_id, u_int64_t attr_id, u_int32_
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -542,7 +540,7 @@ int tmonitor_get_value_uint(int id, int resource_id, u_int64_t attr_id, u_int32_
 EXPORT
 int tmonitor_get_value_uint64(int id, int resource_id, u_int64_t attr_id, u_int64_t *value)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -555,7 +553,7 @@ int tmonitor_get_value_uint64(int id, int resource_id, u_int64_t attr_id, u_int6
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -576,7 +574,7 @@ int tmonitor_get_value_uint64(int id, int resource_id, u_int64_t attr_id, u_int6
 EXPORT
 int tmonitor_get_value_double(int id, int resource_id, u_int64_t attr_id, double *value)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -589,7 +587,7 @@ int tmonitor_get_value_double(int id, int resource_id, u_int64_t attr_id, double
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -610,7 +608,7 @@ int tmonitor_get_value_double(int id, int resource_id, u_int64_t attr_id, double
 EXPORT
 int tmonitor_get_value_string(int id, int resource_id, u_int64_t attr_id, char *value)
 {
-       char buffer[MAX_BUF_SIZE + 1];
+       char buffer[GENERIC_BUFF_MAX + 1];
        int buffer_len;
        int response_req;
        int ret;
@@ -623,7 +621,7 @@ int tmonitor_get_value_string(int id, int resource_id, u_int64_t attr_id, char *
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
                return -EIO;
@@ -644,41 +642,55 @@ int tmonitor_get_value_string(int id, int resource_id, u_int64_t attr_id, char *
 static int
 tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **array, int *length)
 {
-       char buffer[MAX_BUF_SIZE + 1];
-       char _array_str[MAX_BUF_SIZE];
-       char *array_item, *array_str = _array_str;
+       char *array_item, *array_str, *buffer;
        int array_len, array_type;
        int buffer_len;
        int response_req;
        int ret, i;
 
-       buffer_len = sprintf(buffer, "%d:%d:%"PRIu64,
+       buffer = malloc(ARRAY_BUFF_MAX + 1);
+       if (!buffer)
+               return -ENOMEM;
+
+       array_str = malloc(ARRAY_BUFF_MAX);
+       if (!array_str) {
+               free(buffer);
+               return -ENOMEM;
+       }
+
+       buffer_len = snprintf(buffer, ARRAY_BUFF_MAX, "%d:%d:%"PRIu64,
                        REQUEST_GET_VALUE_ARRAY, res_id, attr_id);
        if (send(id, buffer, buffer_len, 0) < 0) {
                _E("[libpass] error occurred while sending buffer");
-               return -EIO;
+               ret = -EIO;
+               goto out_free;
        }
 
        /* wait for response */
-       buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+       buffer_len = recv(id, buffer, ARRAY_BUFF_MAX, 0);
        if (buffer_len <= 0) {
                _E("[libpass] socket disconnected");
-               return -EIO;
+               ret = -EIO;
+               goto out_free;
        }
-
        buffer[buffer_len] = '\0';
+
        if (sscanf(buffer, "%d:%d|%d|%[^:]:%d", &response_req,
-                               &array_type, &array_len, array_str, &ret) < 5)
-               return -EINVAL;
+                               &array_type, &array_len, array_str, &ret) < 5) {
+               ret = -EINVAL;
+               goto out_free;
+       }
 
        if (response_req != REQUEST_GET_VALUE_ARRAY) {
                _E("[libpass] wrong response");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto out_free;
        }
 
        if (data_type != array_type) {
                _E("[libpass] wrong data type");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto out_free;
        }
 
        switch (array_type) {
@@ -686,8 +698,10 @@ tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **
                {
                        int32_t *new_array = malloc(array_len * sizeof(int32_t));
 
-                       if (!new_array)
-                               return -ENOMEM;
+                       if (!new_array) {
+                               ret = -ENOMEM;
+                               goto out_free;
+                       }
 
                        for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
                                new_array[i] = strtol(array_item, NULL, 10);
@@ -700,8 +714,10 @@ tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **
                {
                        int64_t *new_array = malloc(array_len * sizeof(int64_t));
 
-                       if (!new_array)
-                               return -ENOMEM;
+                       if (!new_array) {
+                               ret = -ENOMEM;
+                               goto out_free;
+                       }
 
                        for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
                                new_array[i] = strtoll(array_item, NULL, 10);
@@ -714,8 +730,10 @@ tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **
                {
                        u_int32_t *new_array = malloc(array_len * sizeof(u_int32_t));
 
-                       if (!new_array)
-                               return -ENOMEM;
+                       if (!new_array) {
+                               ret = -ENOMEM;
+                               goto out_free;
+                       }
 
                        for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
                                new_array[i] = strtoul(array_item, NULL, 10);
@@ -728,8 +746,10 @@ tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **
                {
                        u_int64_t *new_array = malloc(array_len * sizeof(u_int64_t));
 
-                       if (!new_array)
-                               return -ENOMEM;
+                       if (!new_array) {
+                               ret = -ENOMEM;
+                               goto out_free;
+                       }
 
                        for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
                                new_array[i] = strtoull(array_item, NULL, 10);
@@ -742,8 +762,10 @@ tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **
                {
                        double *new_array = malloc(array_len * sizeof(double));
 
-                       if (!new_array)
-                               return -ENOMEM;
+                       if (!new_array) {
+                               ret = -ENOMEM;
+                               goto out_free;
+                       }
 
                        for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
                                new_array[i] = strtod(array_item, NULL);
@@ -756,8 +778,10 @@ tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **
                {
                        char **new_array = calloc(array_len, sizeof(char *));
 
-                       if (!new_array)
-                               return -ENOMEM;
+                       if (!new_array) {
+                               ret = -ENOMEM;
+                               goto out_free;
+                       }
 
                        for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++) {
                                char *new_item = g_strdup(array_item);
@@ -766,7 +790,8 @@ tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **
                                        for (int j = i - 1; j >= 0; j--)
                                                free(new_array[j]);
                                        free(new_array);
-                                       return -ENOMEM;
+                                       ret = -ENOMEM;
+                                       goto out_free;
                                }
 
                                new_array[i] = new_item;
@@ -778,9 +803,13 @@ tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **
                }
        default:
                _E("[libpass] not supported array data type");
-               return -EINVAL;
+               ret = -EINVAL;
        }
 
+out_free:
+       free(buffer);
+       free(array_str);
+
        return ret;
 }
 
index 647a704..9d8a224 100644 (file)
@@ -430,17 +430,22 @@ static int split_request_type_and_args(char *buffer, char **args)
                _E("failed to add response"); \
 } \
 
-static void handle_request(struct request_client *client, char *buffer)
+static int handle_request(struct request_client *client, char *request)
 {
-       char _response[REQUEST_BUFFER_MAX];
-       char *response = _response;
-       char *args;
-       int request_type;
-       int ret;
-       int buffer_len = REQUEST_BUFFER_MAX;
+       char *response, *response_entry, *args;
+       int request_type, buffer_len, ret;
        char err_buf[BUFF_MAX];
 
-       request_type = split_request_type_and_args(buffer, &args);
+       request_type = split_request_type_and_args(request, &args);
+
+       if (request_type == REQUEST_GET_VALUE_ARRAY)
+               buffer_len = ARRAY_BUFF_MAX + 1;
+       else
+               buffer_len = GENERIC_BUFF_MAX + 1;
+
+       response_entry = response = malloc(buffer_len);
+       if (!response_entry)
+               return -ENOMEM;
 
        /**
         * Format of response
@@ -630,10 +635,14 @@ static void handle_request(struct request_client *client, char *buffer)
        }
        ADD_RESPONSE(response, buffer_len, "%d", ret);
 
-       if (send(client->socket_fd, _response, strlen(_response), 0) < 0) {
+       if (send(client->socket_fd, response_entry, strlen(response_entry), 0) < 0) {
                strerror_r(errno, err_buf, BUFF_MAX);
                _E("Failed to send respones, errno: %d, error: %s", errno, err_buf);
        }
+
+       free(response_entry);
+
+       return 0;
 }
 
 static GList *g_request_client_head;
@@ -669,31 +678,32 @@ static void destroy_request_client(struct request_client *client)
 
 static int request_handler_func(void *data, void **result)
 {
-       char buffer[REQUEST_BUFFER_MAX + 1];
+       char request[GENERIC_BUFF_MAX + 1];
        struct request_client *client = (struct request_client *)data;
-       int len;
+       int len, ret;
        char err_buf[BUFF_MAX];
 
        _D("Start worker thread for client-%d", client->socket_fd);
 
        while (1) {
-               len = recv(client->socket_fd, buffer, REQUEST_BUFFER_MAX, 0);
-               if (len == 0) {
-                       _D("Client-%d is disconnected", client->socket_fd);
-                       goto out;
-               }
+               len = recv(client->socket_fd, request, GENERIC_BUFF_MAX, 0);
+               if (len == 0)
+                       break;
 
                if (len < 0) {
                        strerror_r(errno, err_buf, BUFF_MAX);
                        _E("Error occurs while receiving request: errno: %d, error: %s",
                                        errno, err_buf);
-                       goto out;
+                       break;
                }
 
-               buffer[len] = '\0';
-               handle_request(client, buffer);
+               request[len] = '\0';
+               ret = handle_request(client, request);
+               if (ret < 0)
+                       break;
        }
-out:
+
+       _D("Client-%d is disconnected", client->socket_fd);
        g_hash_table_destroy(client->resource_table);
        close(client->socket_fd);
        destroy_request_client(client);