From 8ca27bb356cb1ed006b14aacffd8b3a67abe8819 Mon Sep 17 00:00:00 2001 From: Michal Sekletar <msekleta@redhat.com> Date: Dec 15 2020 17:54:52 +0000 Subject: process-util: don't use overly large buffer to store process command line Allocate new string as a return value and free our "scratch pad" buffer that is potentially much larger than needed (up to _SC_ARG_MAX). Fixes #11502 (cherry-picked from commit eb1ec489eef8a32918bbfc56a268c9d10464584d) Related: #1664976 patch_name: 0077-process-util-don-t-use-overly-large-buffer-to-store-.patch present_in_specfile: true location_in_specfile: 77 squash_commits: true --- diff --git a/src/basic/process-util.c b/src/basic/process-util.c index a20f1e3..aa3eff7 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -101,7 +101,8 @@ int get_process_comm(pid_t pid, char **ret) { int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line) { _cleanup_fclose_ FILE *f = NULL; bool space = false; - char *k, *ans = NULL; + char *k; + _cleanup_free_ char *ans = NULL; const char *p; int c; @@ -142,7 +143,7 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char * if (!ans) return -ENOMEM; - *line = ans; + *line = TAKE_PTR(ans); return 0; } else { @@ -207,7 +208,7 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char * _cleanup_free_ char *t = NULL; int h; - free(ans); + ans = mfree(ans); if (!comm_fallback) return -ENOENT; @@ -240,9 +241,18 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char * if (!ans) return -ENOMEM; } + + *line = TAKE_PTR(ans); + return 0; } - *line = ans; + k = realloc(ans, strlen(ans) + 1); + if (!k) + return -ENOMEM; + + ans = NULL; + *line = k; + return 0; }