Fix: Malloc only when making process entry in tree 16/179616/1 accepted/tizen/unified/20180521.003651 submit/tizen/20180521.000329
authorNishant Chaprana <n.chaprana@samsung.com>
Fri, 18 May 2018 14:48:09 +0000 (20:18 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Fri, 18 May 2018 14:48:09 +0000 (20:18 +0530)
Description:
For some processes both FORK and EXEC events are emitted, however
we were allocating mamory in both methods, but not unallocating the
memory in failure case when entry was already present.

So we should malloc only when we are creating an entry in process tree.

Change-Id: Iedc3c10eabb41ad4da854ab8d0cf45759bbedcc7
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
packaging/stc-manager.spec
plugin/procfs/stc-plugin-procfs.c

index de1f0c8..f01d2a5 100644 (file)
@@ -1,6 +1,6 @@
 Name:       stc-manager
 Summary:    STC(Smart Traffic Control) manager
-Version:    0.0.64
+Version:    0.0.65
 Release:    0
 Group:      Network & Connectivity/Other
 License:    Apache-2.0
index df2c195..36b8f78 100644 (file)
@@ -145,8 +145,7 @@ static proc_value_s * __proc_tree_find_parent(proc_value_s *value)
        return parent;
 }
 
-static void __proc_tree_add(proc_key_s *key,
-                           proc_value_s *value)
+static void __proc_tree_add(proc_key_s *key, proc_value_s *value)
 {
        proc_value_s *lookup;
        proc_value_s *parent;
@@ -156,32 +155,54 @@ static void __proc_tree_add(proc_key_s *key,
                return;
        }
 
+       if (key == NULL || value == NULL) {
+               if (STC_DEBUG_LOG)
+                       STC_LOGE("invalid parameters");
+               return;
+       }
+
        lookup = g_tree_lookup(proc_tree, key);
        if (lookup) {
                if (STC_DEBUG_LOG)
                        STC_LOGD("LOOKUP: tgid[\033[1;33m%s\033[0;m] pid[%s] ppid[\033[1;35m%s\033[0;m] "
-                               "cmdline[\033[0;34m%s\033[0;m] name[%s]", lookup->status[PROC_STATUS_TGID],
-                               lookup->status[PROC_STATUS_PID], lookup->status[PROC_STATUS_PPID],
-                               lookup->cmdline, lookup->status[PROC_STATUS_NAME]);
+                                "cmdline[\033[0;34m%s\033[0;m] name[%s]", lookup->status[PROC_STATUS_TGID],
+                                lookup->status[PROC_STATUS_PID], lookup->status[PROC_STATUS_PPID],
+                                lookup->cmdline, lookup->status[PROC_STATUS_NAME]);
                return;
        }
 
+       proc_key_s *proc_key = MALLOC0(proc_key_s, 1);
+       if (proc_key == NULL) {
+               STC_LOGE("memory allocation failed");
+               return;
+       }
+
+       proc_value_s *proc_value = MALLOC0(proc_value_s, 1);
+       if (proc_value == NULL) {
+               STC_LOGE("memory allocation failed");
+               FREE(proc_key);
+               return;
+       }
+
+       memcpy(proc_key, key, sizeof(proc_key_s));
+       memcpy(proc_value, value, sizeof(proc_value_s));
+
        if (STC_DEBUG_LOG)
                STC_LOGD("cmdline [%s] pid[%s] ppid[%s]", value->cmdline,
-                       value->status[PROC_STATUS_PID], value->status[PROC_STATUS_PPID]);
+                        value->status[PROC_STATUS_PID], value->status[PROC_STATUS_PPID]);
 
-       g_tree_insert(proc_tree, key, value);
+       g_tree_insert(proc_tree, proc_key, proc_value);
 
        if (STC_DEBUG_LOG)
                __proc_tree_printall();
 
-       parent = __proc_tree_find_parent(value);
+       parent = __proc_tree_find_parent(proc_value);
        if (parent != NULL)
-               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, key->pid,
+               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, proc_key->pid,
                        parent->cmdline, parent->cmdline, STC_APP_TYPE_SERVICE);
        else
-               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, key->pid,
-                       value->cmdline, value->cmdline, STC_APP_TYPE_SERVICE);
+               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, proc_key->pid,
+                       proc_value->cmdline, proc_value->cmdline, STC_APP_TYPE_SERVICE);
 }
 
 static void __proc_tree_remove(const proc_key_s *key)
@@ -278,6 +299,10 @@ static void __process_event_fork(int tgid, int pid)
        char cmdline[PROC_NAME_MAX] = {0, };
        char status[PROC_STATUS_CNT][PROC_BUF_MAX];
 
+       /* TODO: Add newly created thread to the process tasks */
+       if (tgid != pid)
+               return;
+
        memset(status, 0x0, sizeof(status));
 
        if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
@@ -290,26 +315,16 @@ static void __process_event_fork(int tgid, int pid)
                }
 
                unsigned int i;
-               proc_key_s *key;
-               proc_value_s *value;
-
-               key = MALLOC0(proc_key_s, 1);
-               if (key == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       return;
-               }
+               proc_key_s key;
+               proc_value_s value;
 
-               value = MALLOC0(proc_value_s, 1);
-               if (value == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       FREE(key);
-                       return;
-               }
+               memset(&key, 0x0, sizeof(proc_key_s));
+               memset(&value, 0x0, sizeof(proc_value_s));
 
-               key->pid = tgid;
+               key.pid = tgid;
                for (i = 0; i < PROC_STATUS_CNT; ++i)
-                       g_strlcpy(value->status[i], status[i], sizeof(value->status[i]));
-               g_strlcpy(value->cmdline, cmdline, sizeof(value->cmdline));
+                       g_strlcpy(value.status[i], status[i], sizeof(value.status[i]));
+               g_strlcpy(value.cmdline, cmdline, sizeof(value.cmdline));
 
                if (STC_DEBUG_LOG) {
                        STC_LOGD("\033[1;34mFORK\033[0;m: tgid[\033[1;33m%d\033[0;m] ppid=[\033[1;35m%s\033[0;m] "
@@ -319,7 +334,7 @@ static void __process_event_fork(int tgid, int pid)
                                status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TRACERPID]);
                }
 
-               __proc_tree_add(key, value);
+               __proc_tree_add(&key, &value);
        }
 }
 
@@ -328,6 +343,10 @@ static void __process_event_exec(int tgid, int pid)
        char cmdline[PROC_NAME_MAX] = {0, };
        char status[PROC_STATUS_CNT][PROC_BUF_MAX];
 
+       /* TODO: Add newly created thread to the process tasks */
+       if (tgid != pid)
+               return;
+
        memset(status, 0x0, sizeof(status));
 
        if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
@@ -340,26 +359,17 @@ static void __process_event_exec(int tgid, int pid)
                }
 
                unsigned int i;
-               proc_key_s *key;
-               proc_value_s *value;
-
-               key = MALLOC0(proc_key_s, 1);
-               if (key == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       return;
-               }
+               proc_key_s key;
+               proc_value_s value;
 
-               value = MALLOC0(proc_value_s, 1);
-               if (value == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       FREE(key);
-                       return;
-               }
+               memset(&key, 0x0, sizeof(proc_key_s));
+               memset(&value, 0x0, sizeof(proc_value_s));
 
-               key->pid = tgid;
+               key.pid = tgid;
                for (i = 0; i < PROC_STATUS_CNT; ++i)
-                       g_strlcpy(value->status[i], status[i], sizeof(value->status[i]));
-               g_strlcpy(value->cmdline, cmdline, sizeof(value->cmdline));
+                       g_strlcpy(value.status[i], status[i],
+                                 sizeof(value.status[i]));
+               g_strlcpy(value.cmdline, cmdline, sizeof(value.cmdline));
 
                if (STC_DEBUG_LOG) {
                        STC_LOGD("\033[1;32mEXEC\033[0;m: tgid[\033[1;33m%d\033[0;m] ppid=[\033[1;35m%s\033[0;m] "
@@ -369,7 +379,7 @@ static void __process_event_exec(int tgid, int pid)
                                status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TRACERPID]);
                }
 
-               __proc_tree_add(key, value);
+               __proc_tree_add(&key, &value);
        }
 }
 
@@ -548,8 +558,10 @@ int stc_plugin_procfs_deinitialize(void)
        return STC_ERROR_NONE;
 }
 
-stc_error_e stc_plugin_procfs_status_changed(stc_cmd_type_e cmd,
-                               pid_t pid, const gchar *app_id, const gchar *pkg_id, stc_app_type_e app_type)
+stc_error_e stc_plugin_procfs_status_changed(stc_cmd_type_e cmd, pid_t pid,
+                                            const gchar *app_id,
+                                            const gchar *pkg_id,
+                                            stc_app_type_e app_type)
 {
        stc_error_e ret = STC_ERROR_NONE;