summaryrefslogtreecommitdiffstats
path: root/meta-security/recipes-devtools/e2fsprogs/files/ext_attr.c-fix-adding-multiple-xattrs-during-image-c.patch
blob: 67b8b68fbc9d853c56ef3a49789a66bd6ee3b1fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
From 3b2b0922e031628f313f5480c4f1f9413c6656bf Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
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