From: Masatake YAMATO Date: Fri, 20 Jan 2012 04:00:34 +0000 (+0900) Subject: libmount: fix a potential memory leak at mnt_table_parse_dir X-Git-Tag: v2.21-rc2~110 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b28890b04185676354b38d5443109d196f95d2d8;p=thirdparty%2Futil-linux.git libmount: fix a potential memory leak at mnt_table_parse_dir mnt_table_parse_dir in libmount/src/tab_parse.c calls scandir, and then opendir. When the latter one, opendir is failed, buffers allocated in scandir are not released. Signed-off-by: Masatake YAMATO --- diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c index bbdea553c7..369325db13 100644 --- a/libmount/src/tab_parse.c +++ b/libmount/src/tab_parse.c @@ -501,7 +501,7 @@ static int mnt_table_parse_dir(struct libmnt_table *tb, const char *dirname) #else static int mnt_table_parse_dir(struct libmnt_table *tb, const char *dirname) { - int n = 0, i; + int n = 0, i, r = 0; DIR *dir = NULL; struct dirent **namelist = NULL; @@ -511,8 +511,10 @@ static int mnt_table_parse_dir(struct libmnt_table *tb, const char *dirname) /* let use "at" functions rather than play crazy games with paths... */ dir = opendir(dirname); - if (!dir) - return -errno; + if (!dir) { + r = -errno; + goto out; + } for (i = 0; i < n; i++) { struct dirent *d = namelist[i]; @@ -531,12 +533,13 @@ static int mnt_table_parse_dir(struct libmnt_table *tb, const char *dirname) } } +out: for (i = 0; i < n; i++) free(namelist[i]); free(namelist); if (dir) closedir(dir); - return 0; + return r; } #endif