Ignore xattr_prefix_{count,start} and do not validate the inode-sharing
prefix id without INCOMPAT_XATTR_PREFIXES bit set. This keeps stale
superblock bytes from enabling long xattr prefix decoding on images
that did not declare the feature.

Assisted-by: Codex:GPT-5.5
Signed-off-by: Yifan Zhao <[email protected]>
---
 lib/super.c | 3 ++-
 lib/xattr.c | 5 +++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/lib/super.c b/lib/super.c
index c21d5ad..899d51a 100644
--- a/lib/super.c
+++ b/lib/super.c
@@ -149,7 +149,8 @@ int erofs_read_superblock(struct erofs_sb_info *sbi)
        sbi->build_time = le32_to_cpu(dsb->build_time);
 
        memcpy(&sbi->uuid, dsb->uuid, sizeof(dsb->uuid));
-       if (erofs_sb_has_ishare_xattrs(sbi)) {
+       if (erofs_sb_has_ishare_xattrs(sbi) &&
+           erofs_sb_has_xattr_prefixes(sbi)) {
                if (dsb->ishare_xattr_prefix_id >= sbi->xattr_prefix_count) {
                        erofs_err("invalid ishare xattr prefix id %d",
                                  dsb->ishare_xattr_prefix_id);
diff --git a/lib/xattr.c b/lib/xattr.c
index 1891ac3..6093572 100644
--- a/lib/xattr.c
+++ b/lib/xattr.c
@@ -1547,6 +1547,11 @@ int erofs_xattr_prefixes_init(struct erofs_sb_info *sbi)
        int ret = 0, i, len;
        void *buf;
 
+       if (!erofs_sb_has_xattr_prefixes(sbi)) {
+               sbi->xattr_prefix_count = 0;
+               return 0;
+       }
+
        if (!sbi->xattr_prefix_count)
                return 0;
 
-- 
2.47.3


Reply via email to