cluster: RHEL510 - fsck.gfs2: Fix memory leak in initialize.c
Bob Peterson
rpeterso at fedoraproject.org
Fri Apr 5 13:46:34 UTC 2013
Gitweb: http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=f6e426b5aa22692e414192d5aa70e4ef15db1c18
Commit: f6e426b5aa22692e414192d5aa70e4ef15db1c18
Parent: 0059c9378ae6cfa28742f96065ade198d8807787
Author: Bob Peterson <rpeterso at redhat.com>
AuthorDate: Thu Jan 12 14:31:45 2012 -0600
Committer: Bob Peterson <rpeterso at redhat.com>
CommitterDate: Fri Apr 5 06:25:01 2013 -0700
fsck.gfs2: Fix memory leak in initialize.c
This patch fixes a memory leak whereby dinodes were not being freed
under certain conditions.
rhbz#877150
---
gfs2/fsck/initialize.c | 25 ++++++++++++++++---------
1 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c
index 0e798ef..df955eb 100644
--- a/gfs2/fsck/initialize.c
+++ b/gfs2/fsck/initialize.c
@@ -770,7 +770,7 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
ip = inode_read(sdp, di->di_num.no_addr);
if (di->di_num.no_formal_ino == 3) {
if (fix_md.jiinode || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
log_warn(_("Found system jindex file at: 0x%llx\n"),
di->di_num.no_addr);
fix_md.jiinode = ip;
@@ -779,8 +779,10 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
jindex: master */
gfs2_lookupi(ip, "jindex", 6, &child_ip);
if (child_ip) {
- if (fix_md.jiinode || is_journal_copy(ip, bh))
- return;
+ if (fix_md.jiinode || is_journal_copy(ip, bh)) {
+ inode_put(&child_ip);
+ goto out_discard_ip;
+ }
fix_md.jiinode = child_ip;
sdp->sd_sb.sb_master_dir.no_addr = di->di_num.no_addr;
log_warn(_("Found system master directory at: "
@@ -792,8 +794,9 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
has a statfs_change: per_node, and its .. will be master. */
gfs2_lookupi(ip, "statfs_change0", 14, &child_ip);
if (child_ip) {
+ inode_put(&child_ip);
if (fix_md.pinode || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
log_warn(_("Found system per_node directory at: "
"0x%llx\n"), ip->i_di.di_num.no_addr);
fix_md.pinode = ip;
@@ -809,22 +812,22 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
}
log_debug(_("Unknown system directory at block 0x%llx\n"),
di->di_num.no_addr);
- inode_put(&ip);
+ goto out_discard_ip;
} else if (di->di_size == 8) {
if (fix_md.inum || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
fix_md.inum = ip;
log_warn(_("Found system inum file at: 0x%llx\n"),
di->di_num.no_addr);
} else if (di->di_size == 24) {
if (fix_md.statfs || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
fix_md.statfs = ip;
log_warn(_("Found system statfs file at: 0x%llx\n"),
di->di_num.no_addr);
} else if ((di->di_size % 96) == 0) {
if (fix_md.riinode || is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
fix_md.riinode = ip;
log_warn(_("Found system rindex file at: 0x%llx\n"),
di->di_num.no_addr);
@@ -832,11 +835,15 @@ static void peruse_system_dinode(struct gfs2_sbd *sdp, struct gfs2_dinode *di,
di->di_num.no_formal_ino >= 12 &&
di->di_num.no_formal_ino <= 100) {
if (is_journal_copy(ip, bh))
- return;
+ goto out_discard_ip;
fix_md.qinode = ip;
log_warn(_("Found system quota file at: 0x%llx\n"),
di->di_num.no_addr);
}
+ return;
+
+out_discard_ip:
+ inode_put(&ip);
}
/**
More information about the cluster-commits
mailing list