From: Darrick J. Wong Date: Tue, 12 Jul 2022 18:27:33 +0000 (-0500) Subject: xfs_repair: detect and fix padding fields that changed with nrext64 X-Git-Tag: v5.19.0-rc1~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ec4cd6459893cf8866c872085c61414e41235bb;p=thirdparty%2Fxfsprogs-dev.git xfs_repair: detect and fix padding fields that changed with nrext64 Detect incorrectly set padding fields when large extent counts are enabled or disabled on v3 inodes. Found by fuzzing v3.flags2 = zeroes with xfs/374 and an nrext64=1 filesystem. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Eric Sandeen --- diff --git a/repair/dinode.c b/repair/dinode.c index 7610cd456..fa841fbaa 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -2703,6 +2703,26 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"), *dirty = 1; } + if (xfs_dinode_has_large_extent_counts(dino)) { + if (dino->di_nrext64_pad) { + if (!no_modify) { + do_warn(_("fixing bad nrext64_pad.\n")); + dino->di_nrext64_pad = 0; + *dirty = 1; + } else + do_warn(_("would fix bad nrext64_pad.\n")); + } + } else if (dino->di_version >= 3) { + if (dino->di_v3_pad) { + if (!no_modify) { + do_warn(_("fixing bad v3_pad.\n")); + dino->di_v3_pad = 0; + *dirty = 1; + } else + do_warn(_("would fix bad v3_pad.\n")); + } + } + if (!verify_mode && flags2 != be64_to_cpu(dino->di_flags2)) { if (!no_modify) { do_warn(_("fixing bad flags2.\n"));