]> code.ossystems Code Review - openembedded-core.git/commitdiff
pseudo: Fix xattr segfault
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 1 Oct 2020 17:20:06 +0000 (18:20 +0100)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 7 Oct 2020 10:18:35 +0000 (11:18 +0100)
Fix a NULL pointer dereference exposed by the path ignore code in
xattr handling.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/recipes-devtools/pseudo/files/xattr_fix.patch [new file with mode: 0644]
meta/recipes-devtools/pseudo/pseudo_git.bb

diff --git a/meta/recipes-devtools/pseudo/files/xattr_fix.patch b/meta/recipes-devtools/pseudo/files/xattr_fix.patch
new file mode 100644 (file)
index 0000000..61d0030
--- /dev/null
@@ -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;
index a5e79ec9a5c1db7d7f4d80cd81fb91668da9755c..7857b4f1b13558a39ccd864aede0ccf2a9cb9216 100644 (file)
@@ -6,6 +6,7 @@ SRC_URI = "git://git.yoctoproject.org/pseudo;branch=oe-core \
            file://add_ignore_paths.patch \
            file://abort_on_mismatch.patch \
            file://track_link_fds.patch \
+           file://xattr_fix.patch \
            file://fallback-passwd \
            file://fallback-group \
            "