From dc6b85bd8b7db23ad6fcd3ad4c57166481582035 Mon Sep 17 00:00:00 2001 From: Stefani Seibold Date: Thu, 12 Apr 2018 11:14:11 +0200 Subject: [PATCH] fix process attach --- sysdeps/linux-gnu/proc.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/sysdeps/linux-gnu/proc.c b/sysdeps/linux-gnu/proc.c index aaebd16..8dca9ce 100644 --- a/sysdeps/linux-gnu/proc.c +++ b/sysdeps/linux-gnu/proc.c @@ -163,14 +163,14 @@ int process_tasks(pid_t pid, pid_t ** ret_tasks, size_t *ret_n) for(;;) { struct dirent *result; + errno = 0; result = readdir(d); - if (!result) { - free(tasks); - return -1; - } - if (result == NULL) + if (!result) { + if (errno) + goto fail; break; + } if (result->d_type == DT_DIR && all_digits(result->d_name)) { pid_t npid = atoi(result->d_name); @@ -181,10 +181,9 @@ int process_tasks(pid_t pid, pid_t ** ret_tasks, size_t *ret_n) alloc = n > 0 ? (2 * n) : 8; ntasks = realloc(tasks, sizeof(*tasks) * alloc); - if (!ntasks) { - free(tasks); - return -1; - } + if (!ntasks) + goto fail; + tasks = ntasks; } tasks[n++] = npid; @@ -197,6 +196,14 @@ int process_tasks(pid_t pid, pid_t ** ret_tasks, size_t *ret_n) *ret_n = n; return 0; +fail: + free(tasks); + closedir(d); + + *ret_tasks = NULL; + *ret_n = 0; + + return -1; } /* On native 64-bit system, we need to be careful when handling cross