]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_repair: catch bad level/depth in da node
authorEric Sandeen <sandeen@sandeen.net>
Tue, 13 Oct 2015 23:31:17 +0000 (10:31 +1100)
committerDave Chinner <david@fromorbit.com>
Tue, 13 Oct 2015 23:31:17 +0000 (10:31 +1100)
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 <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
repair/attr_repair.c

index 5ae2356d5cbde0885fba10658d85abfc7b55f7c5..2aafdf65b8304e0e3da7ed6e38f07232b0007dbc 100644 (file)
@@ -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  {