From: Pavel Reichl Date: Tue, 9 Dec 2025 22:58:52 +0000 (+0100) Subject: mdrestore: fix restore_v2() superblock length check X-Git-Tag: v6.18.0~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=98f05de13e7815c4d4e637d3dab5d4b40e8533cb;p=thirdparty%2Fxfsprogs-dev.git mdrestore: fix restore_v2() superblock length check On big-endian architectures (e.g. s390x), restoring a filesystem from a v2 metadump fails with "Invalid superblock disk address/length". This is caused by restore_v2() treating a superblock extent length of 1 as an error, even though a length of 1 is expected because the superblock fits within a 512-byte sector. On little-endian systems, the same raw extent length bytes that represent a value of 1 on big-endian are misinterpreted as 16777216 due to byte ordering, so the faulty check never triggers there and the bug is hidden. Fix the issue by using an endian-correct comparison of xme_len so that the superblock extent length is validated properly and consistently on all architectures. Signed-off-by: Pavel Reichl Reviewed-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Reviewed-by: Chandan Babu R --- diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index f10c4bef..b6e8a619 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -437,7 +437,7 @@ restore_v2( if (fread(&xme, sizeof(xme), 1, md_fp) != 1) fatal("error reading from metadump file\n"); - if (xme.xme_addr != 0 || xme.xme_len == 1 || + if (xme.xme_addr != 0 || be32_to_cpu(xme.xme_len) != 1 || (be64_to_cpu(xme.xme_addr) & XME_ADDR_DEVICE_MASK) != XME_ADDR_DATA_DEVICE) fatal("Invalid superblock disk address/length\n");