From f1ec6fa927ccb5d13310a1737cdf237d2a54c45d Mon Sep 17 00:00:00 2001 From: Jan Safranek Date: Wed, 24 Aug 2011 11:40:50 +0200 Subject: [PATCH] libcgroup: Fixed memory and file descriptor leak when enumerating processes Free the resources when fopen or realloc fails. Also remove completelly useless code. Signed-off-by: Jan Safranek Acked-by: Dhaval Giani --- src/api.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/api.c b/src/api.c index 5b2b518d..2ed9e223 100644 --- a/src/api.c +++ b/src/api.c @@ -3882,12 +3882,6 @@ int cgroup_get_procs(char *name, char *controller, pid_t **pids, int *size) if (access(cgroup_path, F_OK)) return ECGROUPUNSUPP; - /* - * Read all the procs and then sort them up. - */ - - tmp_list = *pids; - /* * Keep doubling the memory allocated if needed */ @@ -3900,6 +3894,9 @@ int cgroup_get_procs(char *name, char *controller, pid_t **pids, int *size) procs = fopen(cgroup_path, "r"); if (!procs) { last_errno = errno; + free(tmp_list); + *pids = NULL; + *size = 0; return ECGOTHER; } @@ -3913,10 +3910,15 @@ int cgroup_get_procs(char *name, char *controller, pid_t **pids, int *size) n++; } if (!feof(procs)) { + pid_t *orig_list = tmp_list; tot_procs *= 2; tmp_list = realloc(tmp_list, sizeof(pid_t) * tot_procs); if (!tmp_list) { last_errno = errno; + fclose(procs); + free(orig_list); + *pids = NULL; + *size = 0; return ECGOTHER; } } -- 2.47.2