Gitweb: http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=d873d2a33c42ba... Commit: d873d2a33c42baa8063c6975e430756c9fbbb1e2 Parent: f150dda8961cf6b535da786eb6e9aa5a75a7349f Author: Bob Peterson rpeterso@redhat.com AuthorDate: Fri Jan 6 16:30:30 2012 -0600 Committer: Bob Peterson rpeterso@redhat.com CommitterDate: Fri Apr 5 06:25:00 2013 -0700
fsck.gfs2: Fix memory leaks
This patch fixes some memory leaks in fsck.gfs2 that I discovered by using valgrind.
rhbz#877150 --- gfs2/fsck/fs_recovery.c | 2 ++ gfs2/fsck/initialize.c | 16 ++++++++++------ gfs2/fsck/main.c | 2 ++ gfs2/fsck/metawalk.c | 10 ++++++++-- gfs2/fsck/pass1.c | 6 +++++- 5 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/gfs2/fsck/fs_recovery.c b/gfs2/fsck/fs_recovery.c index 8a4ff13..94113ca 100644 --- a/gfs2/fsck/fs_recovery.c +++ b/gfs2/fsck/fs_recovery.c @@ -623,6 +623,8 @@ int replay_journals(struct gfs2_sbd *sdp, int preen, int force_check, inode_put(&sdp->md.journal[i]); } inode_put(&sdp->md.jiinode); + free(sdp->md.journal); + sdp->md.journal = NULL; /* Sync the buffers to disk so we get a fresh start. */ fsync(sdp->device_fd); return error; diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c index 150c586..8ab5f48 100644 --- a/gfs2/fsck/initialize.c +++ b/gfs2/fsck/initialize.c @@ -589,12 +589,16 @@ static int init_system_inodes(struct gfs2_sbd *sdp) } do_init_statfs(sdp); } - buf = malloc(sdp->md.statfs->i_di.di_size); - // FIXME: handle failed malloc - gfs2_readi(sdp->md.statfs, buf, 0, sdp->md.statfs->i_di.di_size); - /* call gfs2_inum_range_in() to retrieve range */ - gfs2_statfs_change_in(&sc, buf); - free(buf); + if (sdp->md.statfs->i_di.di_size) { + buf = malloc(sdp->md.statfs->i_di.di_size); + if (buf) { + gfs2_readi(sdp->md.statfs, buf, 0, + sdp->md.statfs->i_di.di_size); + /* call gfs2_inum_range_in() to retrieve range */ + gfs2_statfs_change_in(&sc, buf); + free(buf); + } + }
gfs2_lookupi(sdp->master_dir, "quota", 5, &sdp->md.qinode); if (!sdp->md.qinode) { diff --git a/gfs2/fsck/main.c b/gfs2/fsck/main.c index 62852af..4e556f1 100644 --- a/gfs2/fsck/main.c +++ b/gfs2/fsck/main.c @@ -355,6 +355,8 @@ int main(int argc, char **argv) inode_put(&sdp->md.statfs); for (j = 0; j < sdp->md.journals; j++) inode_put(&sdp->md.journal[j]); + free(sdp->md.journal); + sdp->md.journal = NULL; inode_put(&sdp->md.jiinode); inode_put(&sdp->md.riinode); inode_put(&sdp->md.qinode); diff --git a/gfs2/fsck/metawalk.c b/gfs2/fsck/metawalk.c index a580867..31ceca9 100644 --- a/gfs2/fsck/metawalk.c +++ b/gfs2/fsck/metawalk.c @@ -1145,8 +1145,10 @@ static int build_and_check_metalist(struct gfs2_inode *ip, osi_list_t *mlp, for (ptr = (uint64_t *)(bh->b_data + head_size); (char *)ptr < (bh->b_data + ip->i_sbd->bsize); ptr++) { - if (skip_this_pass || fsck_abort) + if (skip_this_pass || fsck_abort) { + free_metalist(ip, mlp); return FSCK_OK; + } nbh = NULL;
if (!*ptr) @@ -1258,6 +1260,7 @@ int check_metatree(struct gfs2_inode *ip, struct metawalk_fxns *pass) error = build_and_check_metalist(ip, &metalist[0], pass); if (error) { stack; + free_metalist(ip, &metalist[0]); return error; }
@@ -1294,8 +1297,10 @@ int check_metatree(struct gfs2_inode *ip, struct metawalk_fxns *pass) last_reported_fblock = -10000000;
while (error >= 0 && !osi_list_empty(list)) { - if (fsck_abort) + if (fsck_abort) { + free_metalist(ip, &metalist[0]); return 0; + } bh = osi_list_entry(list->next, struct gfs2_buffer_head, b_altlist);
@@ -1345,6 +1350,7 @@ int check_metatree(struct gfs2_inode *ip, struct metawalk_fxns *pass) (unsigned long long)ip->i_di.di_num.no_addr); fflush(stdout); } + free_metalist(ip, &metalist[0]); return error; }
diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c index 79fd216..c241960 100644 --- a/gfs2/fsck/pass1.c +++ b/gfs2/fsck/pass1.c @@ -434,6 +434,7 @@ static int check_metalist(struct gfs2_inode *ip, uint64_t block, fsck_blockmap_set(ip, block, _("bad indirect"), gfs2_meta_inval); brelse(nbh); + nbh = NULL; return 1; } brelse(nbh); @@ -443,8 +444,11 @@ static int check_metalist(struct gfs2_inode *ip, uint64_t block,
bc->indir_count++; if (found_dup) { - if (nbh) + if (nbh) { brelse(nbh); + nbh = NULL; + *bh = NULL; + } return 1; /* don't process the metadata again */ } else fsck_blockmap_set(ip, block, _("indirect"),
cluster-commits@lists.fedorahosted.org