[PATCH] erofs-utils: lib: avoid malformed metabox metadata

Gao Xiang hsiangkao at linux.alibaba.com
Mon Nov 24 03:24:37 AEDT 2025


 - If metadata compression is off, images shouldn't have
   METABOX-marked NIDs;

 - `metabox_nid` itself shouldn't be METABOX-marked.

Fixes: 7928074b7643 ("erofs-utils: introduce metadata compression [metabox]")
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 lib/data.c  | 3 +++
 lib/super.c | 2 ++
 2 files changed, 5 insertions(+)

diff --git a/lib/data.c b/lib/data.c
index 1e5113406512..6fd1389cc09f 100644
--- a/lib/data.c
+++ b/lib/data.c
@@ -30,6 +30,9 @@ void *erofs_bread(struct erofs_buf *buf, erofs_off_t offset, bool need_kmap)
 		 *       cache to improve userspace metadata performance.
 		 */
 		if (!vf) {
+			if (!erofs_sb_has_metabox(sbi))
+				return ERR_PTR(-EFSCORRUPTED);
+
 			vi = (struct erofs_inode) { .sbi = sbi,
 						    .nid = sbi->metabox_nid };
 			err = erofs_read_inode_from_disk(&vi);
diff --git a/lib/super.c b/lib/super.c
index d626c7cdc76f..5b4a2eb2470d 100644
--- a/lib/super.c
+++ b/lib/super.c
@@ -133,6 +133,8 @@ int erofs_read_superblock(struct erofs_sb_info *sbi)
 					     metabox_nid))
 			return -EFSCORRUPTED;
 		sbi->metabox_nid = le64_to_cpu(dsb->metabox_nid);
+		if (sbi->metabox_nid & BIT_ULL(EROFS_DIRENT_NID_METABOX_BIT))
+			return -EFSCORRUPTED;	/* self-loop detection */
 	}
 	sbi->inos = le64_to_cpu(dsb->inos);
 	sbi->checksum = le32_to_cpu(dsb->checksum);
-- 
2.43.5



More information about the Linux-erofs mailing list