From b2713594cd94727c1344572214d6c3a9b27454be Mon Sep 17 00:00:00 2001 From: Nishant Chaprana Date: Mon, 21 May 2018 10:36:55 +0530 Subject: [PATCH] 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: Iaf69a4f17cb677d1d34558f4aab33e0e20ae4868 Signed-off-by: Nishant Chaprana --- packaging/stc-manager.spec | 2 +- plugin/net-popup/data/stc_noti_datausage.png | Bin plugin/procfs/stc-plugin-procfs.c | 84 ++++++++++++++------------- resources/systemd/stc-manager.service | 0 4 files changed, 44 insertions(+), 42 deletions(-) mode change 100755 => 100644 plugin/net-popup/data/stc_noti_datausage.png mode change 100755 => 100644 resources/systemd/stc-manager.service diff --git a/packaging/stc-manager.spec b/packaging/stc-manager.spec index f2abca1..5a271a8 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.48 +Version: 0.0.49 Release: 0 Group: Network & Connectivity/Other License: Apache-2.0 diff --git a/plugin/net-popup/data/stc_noti_datausage.png b/plugin/net-popup/data/stc_noti_datausage.png old mode 100755 new mode 100644 diff --git a/plugin/procfs/stc-plugin-procfs.c b/plugin/procfs/stc-plugin-procfs.c index f6822d3..82a31c5 100644 --- a/plugin/procfs/stc-plugin-procfs.c +++ b/plugin/procfs/stc-plugin-procfs.c @@ -165,21 +165,37 @@ static void __proc_tree_add(proc_key_s *key, 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)); + STC_LOGD("cmdline [%s] pid[%s] ppid[%s]", value->cmdline, 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) @@ -276,6 +292,9 @@ static void __process_event_fork(int tgid, int pid) char cmdline[PROC_NAME_MAX] = {0, }; char status[PROC_STATUS_CNT][PROC_BUF_MAX]; + if (tgid != pid) + return; + memset(status, 0x0, sizeof(status)); if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) && @@ -288,26 +307,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] " @@ -317,7 +326,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); } } @@ -326,6 +335,9 @@ static void __process_event_exec(int tgid, int pid) char cmdline[PROC_NAME_MAX] = {0, }; char status[PROC_STATUS_CNT][PROC_BUF_MAX]; + if (tgid != pid) + return; + memset(status, 0x0, sizeof(status)); if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) && @@ -338,26 +350,16 @@ 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] " @@ -367,7 +369,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); } } diff --git a/resources/systemd/stc-manager.service b/resources/systemd/stc-manager.service old mode 100755 new mode 100644 -- 2.7.4