xfs
[Top] [All Lists]

[PATCH 08/13] xfs_repair: catch bad level/depth in da node

To: xfs@xxxxxxxxxxx
Subject: [PATCH 08/13] xfs_repair: catch bad level/depth in da node
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Wed, 9 Sep 2015 14:34:06 -0500
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1441827251-13128-1-git-send-email-sandeen@xxxxxxxxxxx>
References: <1441827251-13128-1-git-send-email-sandeen@xxxxxxxxxxx>
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@xxxxxxxxxx>

Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxxx>
---
 repair/attr_repair.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/repair/attr_repair.c b/repair/attr_repair.c
index 5ae2356..2aafdf6 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  {
-- 
1.7.1

<Prev in Thread] Current Thread [Next in Thread>