From 3b2b0922e031628f313f5480c4f1f9413c6656bf Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Wed, 10 Feb 2016 15:51:43 +0100 Subject: [PATCH] ext_attr.c: fix adding multiple xattrs during image creation http://www.nongnu.org/ext2-doc/ext2.html#CONTRIB-EXTENDED-ATTRIBUTES contains the small snippet that "The entry descriptors are sorted by attribute name, so that two extended attribute blocks can be compared efficiently". The libext2fs code in e2fsprogs needs to be taught about this minor sorting detail. Otherwise creating an image with "mkfs.ext -d" from a filesystem that reports xattrs in listxattr() in an order that does not match the expected order will lead to an image where listxattr() reports all xattrs, but reading some values fails with ENODATA. [Patch from RP, commit message from Patrick and RP] Upstream-Status: Pending [https://bugzilla.yoctoproject.org/show_bug.cgi?id=8992] --- lib/ext2fs/ext_attr.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/ext2fs/ext_attr.c b/lib/ext2fs/ext_attr.c index 0a4f8c0..be8f9c3 100644 --- a/lib/ext2fs/ext_attr.c +++ b/lib/ext2fs/ext_attr.c @@ -258,6 +258,7 @@ static struct ea_name_index ea_names[] = { static int attr_compare(const void *a, const void *b) { const struct ext2_xattr *xa = a, *xb = b; + size_t len; if (xa->name == NULL) return +1; @@ -267,7 +268,11 @@ static int attr_compare(const void *a, const void *b) return -1; else if (!strcmp(xb->name, "system.data")) return +1; - return 0; + len = strlen(xa->name) - strlen(xb->name); + if (len) + return len; + + return strcmp(xa->name, xb->name); } static const char *find_ea_prefix(int index) -- 2.1.4