From: Eric Sandeen Date: Tue, 13 Oct 2015 23:31:17 +0000 (+1100) Subject: xfs_repair: catch bad level/depth in da node X-Git-Tag: v4.3.0-rc1~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=02f1c21bf97e896d78aa8e048db752bd6107ac11;p=thirdparty%2Fxfsprogs-dev.git xfs_repair: catch bad level/depth in da node Two tests added some time ago to dir2.c: 44dae5e xfs_repair: test for bad level in dir2 node 28148f6 xfs_repair: catch bad depth in traverse_int_dir2block never made it to the similar tree-walking code in attr_repair.c; fix that up here. The error string details will be fixed up later. Signed-off-by; Eric Sandeen Signed-off-by: Eric Sandeen Reviewed-by: Brian Foster Signed-off-by: Dave Chinner --- diff --git a/repair/attr_repair.c b/repair/attr_repair.c index 5ae2356d5..2aafdf65b 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -212,9 +212,17 @@ traverse_int_dablock(xfs_mount_t *mp, /* * maintain level counter */ - if (i == -1) + if (i == -1) { i = da_cursor->active = nodehdr.level; - else { + if (i < 1 || i >= XFS_DA_NODE_MAXDEPTH) { + do_warn( +_("bad header depth for directory inode %" PRIu64 "\n"), + da_cursor->ino); + libxfs_putbuf(bp); + i = -1; + goto error_out; + } + } else { if (nodehdr.level == i - 1) { i--; } else {