erofs-utils: lib: fix sorting shared xattrs
authorSheng Yong <shengyong@oppo.com>
Fri, 13 Sep 2024 14:35:42 +0000 (22:35 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Sat, 14 Sep 2024 12:13:39 +0000 (20:13 +0800)
The length of xattr_item->kvbuf is calculated by EROFS_XATTR_KVSIZE,
and the key part has a trailing '\0' before the value part. When qsort
compares two xattr_items, the key-value length should be calculated by
EROFS_XATTR_KVSIZE, and use memcmp instead of strncmp to avoid key-value
string being cut by '\0'.

Fixes: 5df285cf405d ("erofs-utils: lib: refactor extended attribute name prefixes")
Signed-off-by: Sheng Yong <shengyong@oppo.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240913143542.3265071-1-shengyong@oppo.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
lib/xattr.c

index 63c7fce7fc257ea556e33e1346d53c1fe85ffc78..7fbd24bbdd75fe6536cd69bc9d0afba9d94f4924 100644 (file)
@@ -798,10 +798,10 @@ static int comp_shared_xattr_item(const void *a, const void *b)
 
        ia = *((const struct xattr_item **)a);
        ib = *((const struct xattr_item **)b);
-       la = ia->len[0] + ia->len[1];
-       lb = ib->len[0] + ib->len[1];
+       la = EROFS_XATTR_KVSIZE(ia->len);
+       lb = EROFS_XATTR_KVSIZE(ib->len);
 
-       ret = strncmp(ia->kvbuf, ib->kvbuf, min(la, lb));
+       ret = memcmp(ia->kvbuf, ib->kvbuf, min(la, lb));
        if (ret != 0)
                return ret;