xfs
[Top] [All Lists]

[PATCH] xfs_repair: catch bad depth in traverse_int_dir2block

To: xfs-oss <xfs@xxxxxxxxxxx>
Subject: [PATCH] xfs_repair: catch bad depth in traverse_int_dir2block
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Sun, 07 Jun 2009 22:51:52 -0500
Cc: Richard Kolkovich <richard@xxxxxxxxxxxxx>
User-agent: Thunderbird 2.0.0.21 (Macintosh/20090302)
A bad on-disk tree depth in traverse_int_dir2block() can
later cause a segfault when it's used as an array index in
this function; if we get something beyond the max depth,
just error out and the dir will get rebuilt.

Reported-by: Richard Kolkovich <richard@xxxxxxxxxxxxx>
Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxxx>
---

diff --git a/repair/dir2.c b/repair/dir2.c
index 9575fb1..2723e3b 100644
--- a/repair/dir2.c
+++ b/repair/dir2.c
@@ -339,9 +339,17 @@ traverse_int_dir2block(xfs_mount_t *mp,
                /*
                 * maintain level counter
                 */
-               if (i == -1)
+               if (i == -1) {
                        i = da_cursor->active = be16_to_cpu(node->hdr.level);
-               else  {
+                       if (i >= XFS_DA_NODE_MAXDEPTH) {
+                               do_warn(_("bad header depth for directory "
+                                         "inode %llu\n"),
+                                       da_cursor->ino);
+                               da_brelse(bp);
+                               i = -1;
+                               goto error_out;
+                       }
+               } else {
                        if (be16_to_cpu(node->hdr.level) == i - 1)  {
                                i--;
                        } else  {


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