cluster: RHEL510 - fsck.gfs2: Fix memory leaks

Bob Peterson rpeterso at fedoraproject.org
Fri Apr 5 13:46:23 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=d873d2a33c42baa8063c6975e430756c9fbbb1e2
Commit:        d873d2a33c42baa8063c6975e430756c9fbbb1e2
Parent:        f150dda8961cf6b535da786eb6e9aa5a75a7349f
Author:        Bob Peterson <rpeterso at redhat.com>
AuthorDate:    Fri Jan 6 16:30:30 2012 -0600
Committer:     Bob Peterson <rpeterso at 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"),


More information about the cluster-commits mailing list