summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/pseudo/files/xattr_fix.patch
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2020-10-01 18:20:06 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2020-10-07 11:18:35 +0100
commit929a27bf6cbca94d1141d2094ae0c915d93bd3f4 (patch)
tree4e21fe2f05fa22702234c15b6cc4a5787e8f9999 /meta/recipes-devtools/pseudo/files/xattr_fix.patch
parent9ce621fa2099608ca0ccbb8420b31d71cdd7b00e (diff)
downloadopenembedded-core-contrib-929a27bf6cbca94d1141d2094ae0c915d93bd3f4.tar.gz
pseudo: Fix xattr segfault
Fix a NULL pointer dereference exposed by the path ignore code in xattr handling. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-devtools/pseudo/files/xattr_fix.patch')
-rw-r--r--meta/recipes-devtools/pseudo/files/xattr_fix.patch40
1 files changed, 40 insertions, 0 deletions
diff --git a/meta/recipes-devtools/pseudo/files/xattr_fix.patch b/meta/recipes-devtools/pseudo/files/xattr_fix.patch
new file mode 100644
index 0000000000..61d0030b10
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/files/xattr_fix.patch
@@ -0,0 +1,40 @@
+
+In the xattr handling functions, if result is NULL, which it can be
+with the path ignore code, there is a NULL pointer dereference and
+segfault. Everywhere else checks result first, this appears to just
+be an omission.
+
+Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
+Upstream-Status: Pending
+
+Index: git/ports/linux/xattr/pseudo_wrappers.c
+===================================================================
+--- git.orig/ports/linux/xattr/pseudo_wrappers.c
++++ git/ports/linux/xattr/pseudo_wrappers.c
+@@ -134,7 +134,7 @@ static ssize_t shared_getxattr(const cha
+ pseudo_debug(PDBGF_XATTR, "getxattr(%s [fd %d], %s)\n",
+ path ? path : "<no path>", fd, name);
+ pseudo_msg_t *result = pseudo_client_op(OP_GET_XATTR, 0, fd, -1, path, &buf, name);
+- if (result->result != RESULT_SUCCEED) {
++ if (!result || result->result != RESULT_SUCCEED) {
+ errno = ENOATTR;
+ return -1;
+ }
+@@ -254,7 +254,7 @@ static int shared_setxattr(const char *p
+ static ssize_t shared_listxattr(const char *path, int fd, char *list, size_t size) {
+ RC_AND_BUF
+ pseudo_msg_t *result = pseudo_client_op(OP_LIST_XATTR, 0, fd, -1, path, &buf);
+- if (result->result != RESULT_SUCCEED) {
++ if (!result || result->result != RESULT_SUCCEED) {
+ pseudo_debug(PDBGF_XATTR, "listxattr: no success.\n");
+ errno = ENOATTR;
+ return -1;
+@@ -276,7 +276,7 @@ static int shared_removexattr(const char
+ RC_AND_BUF
+ pseudo_msg_t *result = pseudo_client_op(OP_REMOVE_XATTR, 0, fd, -1, path, &buf, name);
+
+- if (result->result != RESULT_SUCCEED) {
++ if (!result || result->result != RESULT_SUCCEED) {
+ /* docs say ENOATTR, but I don't have one */
+ errno = ENOENT;
+ return -1;