From mboxrd@z Thu Jan 1 00:00:00 1970 From: rpeterso@sourceware.org Date: 26 Feb 2007 19:20:46 -0000 Subject: [Cluster-devel] cluster/gfs2/fsck metawalk.c Message-ID: <20070226192046.8893.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL5 Changes by: rpeterso at sourceware.org 2007-02-26 19:20:46 Modified files: gfs2/fsck : metawalk.c Log message: Resolves bz: 229222: gfs2_fsck stuck in infinite loop Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/metawalk.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3.2.4&r2=1.3.2.5 --- cluster/gfs2/fsck/metawalk.c 2007/01/23 19:54:23 1.3.2.4 +++ cluster/gfs2/fsck/metawalk.c 2007/02/26 19:20:46 1.3.2.5 @@ -96,6 +96,15 @@ } } + if (de.de_rec_len < sizeof(struct gfs2_dirent)) { + log_err("Entry %" PRIu64 "(0x%" + PRIx64 ") of directory %" PRIu64 "(0x%" + PRIx64 ") is corrupt, skipping.\n", + bh->b_blocknr, bh->b_blocknr, + ip->i_di.di_num.no_addr, + ip->i_di.di_num.no_addr); + break; + } if ((char *)dent + de.de_rec_len >= bh_end){ log_debug("Last entry processed.\n"); break; @@ -180,6 +189,15 @@ *update = updated; } + /* Make sure it's really a leaf. */ + if (leaf.lf_header.mh_type != GFS2_METATYPE_LF) { + log_err("Inode %" PRIu64 " (0x%" + PRIx64 ") points to bad leaf " + PRIu64 " (0x%" PRIx64 ").\n", + ip->i_di.di_num.no_addr, leaf_no); + brelse(lbh, *update); + break; + } exp_count = (1 << (ip->i_di.di_depth - leaf.lf_depth)); log_debug("expected count %u - di_depth %u, leaf depth %u\n", exp_count, ip->i_di.di_depth, leaf.lf_depth);