From f0131bdc6ff2b349e84e4767d9fe8b078a0ee521 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Thu, 12 Dec 2013 12:57:48 -0500 Subject: [PATCH] e2fsck: fix memory leaks (on error path) Signed-off-by: Darrick J. Wong Signed-off-by: "Theodore Ts'o" --- e2fsck/journal.c | 4 +++- e2fsck/pass3.c | 5 +++-- e2fsck/profile.c | 2 ++ e2fsck/unix.c | 2 ++ 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/e2fsck/journal.c b/e2fsck/journal.c index eb891ca..6483481 100644 --- a/e2fsck/journal.c +++ b/e2fsck/journal.c @@ -1077,8 +1077,10 @@ int e2fsck_fix_ext3_journal_hint(e2fsck_t ctx) if (!journal_name) return 0; - if (stat(journal_name, &st) < 0) + if (stat(journal_name, &st) < 0) { + free(journal_name); return 0; + } if (st.st_rdev != sb->s_journal_dev) { clear_problem_context(&pctx); diff --git a/e2fsck/pass3.c b/e2fsck/pass3.c index 926f462..fd8ec34 100644 --- a/e2fsck/pass3.c +++ b/e2fsck/pass3.c @@ -53,7 +53,7 @@ static ext2fs_inode_bitmap inode_done_map = 0; void e2fsck_pass3(e2fsck_t ctx) { ext2_filsys fs = ctx->fs; - struct dir_info_iter *iter; + struct dir_info_iter *iter = NULL; #ifdef RESOURCE_TRACK struct resource_track rtrack; #endif @@ -108,7 +108,6 @@ void e2fsck_pass3(e2fsck_t ctx) if (check_directory(ctx, dir->ino, &pctx)) goto abort_exit; } - e2fsck_dir_info_iter_end(ctx, iter); /* * Force the creation of /lost+found if not present @@ -123,6 +122,8 @@ void e2fsck_pass3(e2fsck_t ctx) e2fsck_rehash_directories(ctx); abort_exit: + if (iter) + e2fsck_dir_info_iter_end(ctx, iter); e2fsck_free_dir_info(ctx); if (inode_loop_detect) { ext2fs_free_inode_bitmap(inode_loop_detect); diff --git a/e2fsck/profile.c b/e2fsck/profile.c index 019c6f5..92aa893 100644 --- a/e2fsck/profile.c +++ b/e2fsck/profile.c @@ -318,6 +318,8 @@ profile_init(const char **files, profile_t *ret_profile) /* if the filenames list is not specified return an empty profile */ if ( files ) { for (fs = files; !PROFILE_LAST_FILESPEC(*fs); fs++) { + if (array) + free_list(array); retval = get_dirlist(*fs, &array); if (retval == 0) { if (!array) diff --git a/e2fsck/unix.c b/e2fsck/unix.c index bacb86a..6c4e26d 100644 --- a/e2fsck/unix.c +++ b/e2fsck/unix.c @@ -869,6 +869,8 @@ static errcode_t PRS(int argc, char *argv[], e2fsck_t *ret_ctx) case 'L': replace_bad_blocks++; case 'l': + if (bad_blocks_file) + free(bad_blocks_file); bad_blocks_file = string_copy(ctx, optarg, 0); break; case 'd': -- 1.8.3.1