[PATCH 3/7] xfs_repair: junk corrupt xattr root blocks

Darrick J. Wong
2020-09-07T17:55:39Z

From: Darrick J. Wong <darrick.wong@oracle.com>

If reading the root block of an extended attribute structure fails due
to a corruption error, we should junk the block since we know it's bad.
There's no point in moving on to the (rather insufficient) checks in the
attr code.

Found by fuzzing hdr.freemap[1].base = ones in xfs/400.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
repair/attr_repair.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/repair/attr_repair.c b/repair/attr_repair.c
index 6cec0f7075d5..d92909e1c831 100644
--- a/repair/attr_repair.c
+++ b/repair/attr_repair.c
@@ -1107,6 +1107,15 @@ process_longform_attr(
ino);
return 1;
}
+
+ if (bp->b_error == -EFSCORRUPTED) {
+ do_warn(
+ _("corrupt block 0 of inode %" PRIu64 " attribute fork\n"),
+ ino);
+ libxfs_buf_relse(bp);
+ return 1;
+ }
+
if (bp->b_error == -EFSBADCRC)
(*repair)++;