There are off-by-one issues after refactoring, and the size of kvbuf should be calculated by EROFS_XATTR_KVSIZE instead.
Fixes: 5df285cf405d ("erofs-utils: lib: refactor extended attribute name prefixes") Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- lib/xattr.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/xattr.c b/lib/xattr.c index 427933f..0f6fbe2 100644 --- a/lib/xattr.c +++ b/lib/xattr.c @@ -166,14 +166,6 @@ static unsigned int BKDRHash(char *str, unsigned int len) return hash; } -static unsigned int xattr_item_hash(char *buf, unsigned int len[2], - unsigned int hash[2]) -{ - hash[0] = BKDRHash(buf, len[0]); /* key */ - hash[1] = BKDRHash(buf + len[0], len[1]); /* value */ - return hash[0] ^ hash[1]; -} - static unsigned int put_xattritem(struct xattr_item *item) { if (item->count > 1) @@ -188,11 +180,13 @@ static struct xattr_item *get_xattritem(char *kvbuf, unsigned int len[2]) struct ea_type_node *tnode; unsigned int hash[2], hkey; - hkey = xattr_item_hash(kvbuf, len, hash); + hash[0] = BKDRHash(kvbuf, len[0]); + hash[1] = BKDRHash(kvbuf + EROFS_XATTR_KSIZE(len), len[1]); + hkey = hash[0] ^ hash[1]; hash_for_each_possible(ea_hashtable, item, node, hkey) { if (item->len[0] == len[0] && item->len[1] == len[1] && item->hash[0] == hash[0] && item->hash[1] == hash[1] && - !memcmp(kvbuf, item->kvbuf, len[0] + len[1])) { + !memcmp(kvbuf, item->kvbuf, EROFS_XATTR_KVSIZE(len))) { free(kvbuf); ++item->count; return item; -- 2.39.3