| From eb1ec489eef8a32918bbfc56a268c9d10464584d Mon Sep 17 00:00:00 2001 |
| From: Michal Sekletar <msekleta@redhat.com> |
| Date: Tue, 22 Jan 2019 14:29:50 +0100 |
| Subject: [PATCH] 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 |
| |
| Signed-off-by: Jonah Petri <jonah@petri.us> |
| --- |
| src/basic/process-util.c | 18 ++++++++++++++---- |
| 1 file changed, 14 insertions(+), 4 deletions(-) |
| |
| diff --git a/src/basic/process-util.c b/src/basic/process-util.c |
| index 31fdbd9346..78ce43b944 100644 |
| --- a/src/basic/process-util.c |
| +++ b/src/basic/process-util.c |
| @@ -102,7 +102,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; |
| |
| @@ -143,7 +144,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 { |
| @@ -208,7 +209,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; |
| @@ -241,9 +242,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; |
| } |
| |
| -- |
| 2.14.3 |
| |