From 2716b4877280dc984d40002fe47e9a40f15ccc0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=2E=C3=87a=C4=9Flar=20Onur?= Date: Tue, 19 Nov 2013 18:53:37 -0500 Subject: [PATCH] fix memory leaks reported by cppcheck in src/lxc/lxc_usernsexec.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Free previously allocated memory if realloc fails. Signed-off-by: S.Çağlar Onur Signed-off-by: Serge Hallyn --- src/lxc/lxc_usernsexec.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/lxc/lxc_usernsexec.c b/src/lxc/lxc_usernsexec.c index 9416f2747..2957dd56f 100644 --- a/src/lxc/lxc_usernsexec.c +++ b/src/lxc/lxc_usernsexec.c @@ -201,6 +201,7 @@ static int read_default_map(char *fnam, char which, char *username) if (line) free(line); fclose(fin); + free(newmap); return 0; } @@ -241,6 +242,7 @@ static int run_cmd(char **argv) static int map_child_uids(int pid, struct id_map *map) { char **uidargs = NULL, **gidargs = NULL; + char **newuidargs = NULL, **newgidargs = NULL; int i, nuargs = 2, ngargs = 2; struct id_map *m; @@ -263,9 +265,12 @@ static int map_child_uids(int pid, struct id_map *map) for (m=map; m; m = m->next) { if (m->which == 'b' || m->which == 'u') { nuargs += 3; - uidargs = realloc(uidargs, (nuargs+1) * sizeof(*uidargs)); - if (!uidargs) + newuidargs = realloc(uidargs, (nuargs+1) * sizeof(*uidargs)); + if (!newuidargs) { + free(uidargs) return -1; + } + uidargs = newuidargs; uidargs[nuargs - 3] = malloc(21); uidargs[nuargs - 2] = malloc(21); uidargs[nuargs - 1] = malloc(21); @@ -278,9 +283,12 @@ static int map_child_uids(int pid, struct id_map *map) } if (m->which == 'b' || m->which == 'g') { ngargs += 3; - gidargs = realloc(gidargs, (ngargs+1) * sizeof(*gidargs)); - if (!gidargs) + newgidargs = realloc(gidargs, (ngargs+1) * sizeof(*gidargs)); + if (!newgidargs){ + free(gidargs); return -1; + } + gidargs = newgidargs; gidargs[ngargs - 3] = malloc(21); gidargs[ngargs - 2] = malloc(21); gidargs[ngargs - 1] = malloc(21);