[PATCH 2/2] erofs-utils: mkfs: skip xattrs where getxattr() returns ENODATA

Gao Xiang hsiangkao at linux.alibaba.com
Sat Jun 21 23:28:40 AEST 2025


For example, unprivileged users may not have access to the `trusted.*`
namespace.

It also dumps unidentified xattrs with index 0, which the kernel/FUSE
implementations will ignore.

Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 lib/xattr.c | 27 +++++++++++----------------
 1 file changed, 11 insertions(+), 16 deletions(-)

diff --git a/lib/xattr.c b/lib/xattr.c
index b382ee4..091c88c 100644
--- a/lib/xattr.c
+++ b/lib/xattr.c
@@ -165,6 +165,8 @@ bool erofs_xattr_prefix_matches(const char *key, unsigned int *index,
 {
 	struct xattr_prefix *p;
 
+	*index = 0;
+	*len = 0;
 	for (p = xattr_types; p < xattr_types + ARRAY_SIZE(xattr_types); ++p) {
 		if (p->prefix && !strncmp(p->prefix, key, p->prefix_len)) {
 			*len = p->prefix_len;
@@ -219,13 +221,9 @@ static struct xattr_item *get_xattritem(char *kvbuf, unsigned int len[2])
 	if (!item)
 		return ERR_PTR(-ENOMEM);
 
-	if (!erofs_xattr_prefix_matches(kvbuf, &item->base_index,
-					&item->prefix_len)) {
-		free(item);
-		return ERR_PTR(-ENODATA);
-	}
+	(void)erofs_xattr_prefix_matches(kvbuf, &item->base_index,
+					 &item->prefix_len);
 	DBG_BUGON(len[0] < item->prefix_len);
-
 	INIT_HLIST_NODE(&item->node);
 	item->count = 1;
 	item->kvbuf = kvbuf;
@@ -292,12 +290,7 @@ static struct xattr_item *parse_one_xattr(const char *path, const char *key,
 	item = get_xattritem(kvbuf, len);
 	if (!IS_ERR(item))
 		return item;
-	if (item == ERR_PTR(-ENODATA)) {
-		erofs_warn("skipped unidentified xattr: %s", key);
-		ret = 0;
-	} else {
-		ret = PTR_ERR(item);
-	}
+	ret = PTR_ERR(item);
 out:
 	free(kvbuf);
 	return ERR_PTR(ret);
@@ -443,13 +436,16 @@ static int read_xattrs_from_file(const char *path, mode_t mode,
 			continue;
 
 		item = parse_one_xattr(path, key, keylen);
+		/* skip inaccessible xattrs */
+		if (item == ERR_PTR(-ENODATA) || !item) {
+			erofs_warn("skipped inaccessible xattr %s in %s",
+				   key, path);
+			continue;
+		}
 		if (IS_ERR(item)) {
 			ret = PTR_ERR(item);
 			goto err;
 		}
-		/* skip unidentified xattrs */
-		if (!item)
-			continue;
 
 		ret = erofs_xattr_add(ixattrs, item);
 		if (ret < 0)
@@ -1430,7 +1426,6 @@ int erofs_getxattr(struct erofs_inode *vi, const char *name, char *buffer,
 
 	if (!erofs_xattr_prefix_matches(name, &prefix, &prefixlen))
 		return -ENODATA;
-
 	it.it.sbi = vi->sbi;
 	it.index = prefix;
 	it.name = name + prefixlen;
-- 
2.43.5



More information about the Linux-erofs mailing list