From: Nishant Chaprana Date: Fri, 18 May 2018 14:48:09 +0000 (+0530) Subject: Fix: Malloc only when making process entry in tree X-Git-Tag: accepted/tizen/unified/20180521.003651^0 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fconnectivity%2Fstc-manager.git;a=commitdiff_plain;h=ccdf22a5861f7ce5b4b72810c03e632e1e2e5e92 Fix: Malloc only when making process entry in tree 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 --- diff --git a/packaging/stc-manager.spec b/packaging/stc-manager.spec index de1f0c8..f01d2a5 100644 --- a/packaging/stc-manager.spec +++ b/packaging/stc-manager.spec @@ -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 diff --git a/plugin/procfs/stc-plugin-procfs.c b/plugin/procfs/stc-plugin-procfs.c index df2c195..36b8f78 100644 --- a/plugin/procfs/stc-plugin-procfs.c +++ b/plugin/procfs/stc-plugin-procfs.c @@ -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;