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>
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;