procfs: Fix: do not copy garbage when filename is shorter than PROC_NAME_MAX 96/240896/2
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Wed, 12 Aug 2020 13:59:04 +0000 (15:59 +0200)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Wed, 12 Aug 2020 14:28:53 +0000 (16:28 +0200)
Change-Id: I04d5d68b25fa9795691d109bc52192406758e99f

src/common/procfs.c
src/common/procfs.h
src/memory/lowmem-limit.c
src/memory/vmpressure-lowmem-handler.c
src/proc-stat/proc-monitor.c
src/proc-stat/proc-process.c
tests/lowmem-limit-env.cpp
tests/lowmem-limit-env.hpp
tests/lowmem-limit-mock.cpp

index 5ae5cf2..9f22727 100644 (file)
@@ -26,6 +26,7 @@
  *
  */
 
+#include <assert.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdbool.h>
@@ -59,8 +60,11 @@ static struct sys_node_table sys_node_tables[] = {
        { },
 };
 
-int proc_get_cmdline(pid_t pid, char *cmdline)
+int proc_get_cmdline(pid_t pid, char *cmdline, size_t maxcmdline)
 {
+       assert(cmdline);
+       assert(maxcmdline > 0);
+
        char buf[PROC_BUF_MAX];
        char cmdline_buf[PROC_NAME_MAX];
        char *filename;
@@ -83,8 +87,8 @@ int proc_get_cmdline(pid_t pid, char *cmdline)
        else
                filename = filename + 1;
 
-       memcpy(cmdline, filename, PROC_NAME_MAX - 1);
-       cmdline[PROC_NAME_MAX - 1] = '\0';
+       strncpy(cmdline, filename, maxcmdline - 1);
+       cmdline[maxcmdline - 1] = '\0';
 
        return RESOURCED_ERROR_NONE;
 }
@@ -109,7 +113,7 @@ pid_t find_pid_from_cmdline(char *cmdline)
                pid = atoi(dentry->d_name);
                if (!pid)
                        continue;
-               ret = proc_get_cmdline(pid, appname);
+               ret = proc_get_cmdline(pid, appname, sizeof appname);
                if (ret == RESOURCED_ERROR_NONE) {
                        if (!strncmp(cmdline, appname, strlen(appname)+1)) {
                                foundpid = pid;
@@ -893,7 +897,7 @@ void proc_print_meninfo(FILE *fp)
                if (pid < 1 || pid == caller)
                        continue;
 
-               ret = proc_get_cmdline(pid, cmdline);
+               ret = proc_get_cmdline(pid, cmdline, sizeof cmdline);
                if (ret)
                        continue;
 
index 95abbae..46eb2fb 100644 (file)
@@ -237,7 +237,7 @@ enum {
  * @desc get command line from /proc/{pid}/cmdline
  * @return negative value if error
  */
-int proc_get_cmdline(pid_t pid, char *cmdline);
+int proc_get_cmdline(pid_t pid, char *cmdline, size_t maxcmdline);
 
 /**
  * @desc find pid with /proc/{pid}/cmdline
index 5b141fd..15481a7 100644 (file)
@@ -232,7 +232,7 @@ int lowmem_limit_broadcast(pid_t pid)
        if (pai) {
                appid = pai->appid;
        } else {
-               ret = proc_get_cmdline(pid, appname);
+               ret = proc_get_cmdline(pid, appname, sizeof appname);
                if (ret < 0) {
                        _E("Failed to get cmdline basename of pid(%d)", pid);
                        return ret;
@@ -334,7 +334,7 @@ static bool lowmem_limit_cb(int fd, void *data)
                        goto remove_mle;
                }
 
-               ret = proc_get_cmdline(main_pid, appname);
+               ret = proc_get_cmdline(main_pid, appname, sizeof appname);
                if (ret)
                        _D("fail to get appname");
 
@@ -598,7 +598,7 @@ void lowmem_limit_set(pid_t pid, unsigned int limit)
        if (pai) {
                cgpath = pai->appid;
        } else {
-               ret = proc_get_cmdline(pid, appname);
+               ret = proc_get_cmdline(pid, appname, sizeof appname);
                if (ret < 0) {
                        _E("Failed to get cmdline basename of pid(%d)", pid);
                        return;
index 0cf9854..17b4f87 100644 (file)
@@ -557,7 +557,7 @@ static int lowmem_kill_victim(const struct task_info *tsk,
        if (pid <= 0 || pid == getpid())
                return RESOURCED_ERROR_FAIL;
 
-       ret = proc_get_cmdline(pid, appname);
+       ret = proc_get_cmdline(pid, appname, sizeof appname);
        if (ret == RESOURCED_ERROR_FAIL)
                return RESOURCED_ERROR_FAIL;
 
@@ -2215,7 +2215,7 @@ static int set_vip_list(void)
                if (!pid)
                        continue;
 
-               if (proc_get_cmdline(pid, proc_name) != RESOURCED_ERROR_NONE)
+               if (proc_get_cmdline(pid, proc_name, sizeof proc_name) != RESOURCED_ERROR_NONE)
                        continue;
 
                for (vip_index = 0; vip_index < vip_apps->len; vip_index++) {
index 97d34ba..5b786d2 100644 (file)
@@ -728,7 +728,7 @@ static void proc_dbus_watchdog_handler(GVariant *params)
                return;
        }
 
-       ret = proc_get_cmdline(pid, appname);
+       ret = proc_get_cmdline(pid, appname, sizeof appname);
        if (ret != RESOURCED_ERROR_NONE) {
                _E("ERROR : invalid pid(%d)", pid);
                return;
index ac892fc..3e5583e 100644 (file)
@@ -379,7 +379,7 @@ int proc_sweep_memory(enum proc_sweep_type type, pid_t callpid)
                }
                cur_oom = atoi(buf);
                if (cur_oom >= select_sweep_limit) {
-                       ret = proc_get_cmdline(pid, appname);
+                       ret = proc_get_cmdline(pid, appname, sizeof appname);
                        if (ret != 0) {
                                fclose(fp);
                                continue;
index af60a94..2c29d44 100644 (file)
@@ -364,13 +364,13 @@ int LowmemLimitEnv::cgroup_make_subdir(const char* parentdir, const char* cgroup
        return 0;
 }
 
-int LowmemLimitEnv::proc_get_cmdline(pid_t pid, char *cmdline)
+int LowmemLimitEnv::proc_get_cmdline(pid_t pid, char *cmdline, size_t maxcmdline)
 {
        std::cerr << " -> ";
        const auto *info = find_app_info(pid);
        if (info) {
-               strncpy(cmdline, info->appid, PROC_NAME_MAX - 1);
-               cmdline[PROC_NAME_MAX - 1] = '\0';
+               strncpy(cmdline, info->appid, maxcmdline - 1);
+               cmdline[maxcmdline - 1] = '\0';
                std::cerr << info->appid << std::endl;
                return RESOURCED_ERROR_NONE;
        }
index 655ce07..7e91b5b 100644 (file)
@@ -104,7 +104,7 @@ public:
 
        struct proc_app_info *find_app_info(const pid_t pid);
        int proc_get_mem_usage(pid_t, unsigned int *usage);
-       int proc_get_cmdline(pid_t pid, char *cmdline);
+       int proc_get_cmdline(pid_t pid, char *cmdline, size_t maxcmdline);
 
        int memcg_set_eventfd(const char *memcg, const char *event, char *value);
        int add_fd_read_handler(int fd, fd_changed_cb callback,
index fb8f030..5765b9f 100644 (file)
@@ -33,7 +33,7 @@ WRAP_LIMIT(int, access, (const char *pathname, int mode), (pathname, mode))
 
 /* mocking other module dependencies for lowmem-limit.c */
 MOCK_LIMIT(int, proc_get_mem_usage, (pid_t pid, unsigned int *usage), (pid, usage))
-MOCK_LIMIT(int, proc_get_cmdline, (pid_t pid, char *cmdline), (pid, cmdline))
+MOCK_LIMIT(int, proc_get_cmdline, (pid_t pid, char *cmdline, size_t maxcmdline), (pid, cmdline, maxcmdline))
 MOCK_LIMIT(proc_app_info *, find_app_info, (const pid_t pid), (pid))
 
 MOCK_LIMIT(int, exec_cmd, (int argc, const char *argv[]), (argc, argv))