3e1a43
From 214d606084453f0d2831317a9048a3cbc554fcc4 Mon Sep 17 00:00:00 2001
3e1a43
From: Giuseppe Scrivano <gscrivan@redhat.com>
3e1a43
Date: Wed, 15 Jan 2020 00:02:43 +0100
3e1a43
Subject: [PATCH 1/2] main: check if file is whiteout
3e1a43
3e1a43
when doing a lookup, make sure the returned file is not a whiteout for
3e1a43
functions that expect the file to exist.
3e1a43
3e1a43
Close: https://github.com/containers/fuse-overlayfs/issues/169
3e1a43
3e1a43
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
3e1a43
---
3e1a43
 main.c | 34 +++++++++++++++++-----------------
3e1a43
 1 file changed, 17 insertions(+), 17 deletions(-)
3e1a43
3e1a43
3e1a43
From ce93abae5fcb3be98867bbfd8e13abb2c086d1c2 Mon Sep 17 00:00:00 2001
3e1a43
From: Giuseppe Scrivano <gscrivan@redhat.com>
3e1a43
Date: Wed, 15 Jan 2020 17:52:13 +0100
3e1a43
Subject: [PATCH 2/2] main: do not copyup opaque xattr
3e1a43
3e1a43
when performing the copyup, do not copy the private xattrs.
3e1a43
3e1a43
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
3e1a43
---
3e1a43
 main.c | 8 +++++++-
3e1a43
 1 file changed, 7 insertions(+), 1 deletion(-)
3e1a43
3e1a43
diff -up ./fuse-overlayfs-8c59873b00b3e8ee98be998fec8dbce4cfe984cc/main.c.1804849 ./fuse-overlayfs-8c59873b00b3e8ee98be998fec8dbce4cfe984cc/main.c
3e1a43
--- fuse-overlayfs-8c59873b00b3e8ee98be998fec8dbce4cfe984cc/main.c.1804849	2020-02-20 14:38:04.204508810 +0100
3e1a43
+++ fuse-overlayfs-8c59873b00b3e8ee98be998fec8dbce4cfe984cc/main.c	2020-02-20 14:38:04.208508867 +0100
3e1a43
@@ -2265,7 +2265,7 @@ ovl_getxattr (fuse_req_t req, fuse_ino_t
3e1a43
     }
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -2334,7 +2334,13 @@ copy_xattr (int sfd, int dfd, char *buf,
3e1a43
       for (it = buf; it - buf < xattr_len; it += strlen (it) + 1)
3e1a43
         {
3e1a43
           cleanup_free char *v = NULL;
3e1a43
-          ssize_t s = safe_read_xattr (&v, sfd, it, 256);
3e1a43
+          ssize_t s;
3e1a43
+
3e1a43
+          if (has_prefix (it, XATTR_PREFIX)
3e1a43
+              || has_prefix (it, PRIVILEGED_XATTR_PREFIX))
3e1a43
+            continue;
3e1a43
+
3e1a43
+          s = safe_read_xattr (&v, sfd, it, 256);
3e1a43
           if (s < 0)
3e1a43
             return -1;
3e1a43
 
3e1a43
@@ -2858,7 +2864,7 @@ do_rm (fuse_req_t req, fuse_ino_t parent
3e1a43
   struct ovl_node key, *rm;
3e1a43
 
3e1a43
   node = do_lookup_file (lo, parent, name);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -2904,7 +2910,7 @@ do_rm (fuse_req_t req, fuse_ino_t parent
3e1a43
     }
3e1a43
 
3e1a43
   pnode = do_lookup_file (lo, parent, NULL);
3e1a43
-  if (pnode == NULL)
3e1a43
+  if (pnode == NULL || pnode->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -3009,7 +3015,7 @@ ovl_setxattr (fuse_req_t req, fuse_ino_t
3e1a43
     }
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -3069,7 +3075,7 @@ ovl_removexattr (fuse_req_t req, fuse_in
3e1a43
     fprintf (stderr, "ovl_removexattr(ino=%" PRIu64 "s, name=%s)\n", ino, name);
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -3447,7 +3453,7 @@ ovl_getattr (fuse_req_t req, fuse_ino_t
3e1a43
     fprintf (stderr, "ovl_getattr(ino=%" PRIu64 ")\n", ino);
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -3481,7 +3487,7 @@ ovl_setattr (fuse_req_t req, fuse_ino_t
3e1a43
     fprintf (stderr, "ovl_setattr(ino=%" PRIu64 "s, to_set=%d)\n", ino, to_set);
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -3663,7 +3669,7 @@ ovl_link (fuse_req_t req, fuse_ino_t ino
3e1a43
     fprintf (stderr, "ovl_link(ino=%" PRIu64 "s, newparent=%" PRIu64 "s, newname=%s)\n", ino, newparent, newname);
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -3677,7 +3683,7 @@ ovl_link (fuse_req_t req, fuse_ino_t ino
3e1a43
     }
3e1a43
 
3e1a43
   newparentnode = do_lookup_file (lo, newparent, NULL);
3e1a43
-  if (newparentnode == NULL)
3e1a43
+  if (newparentnode == NULL || newparentnode->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -3802,7 +3808,7 @@ ovl_symlink (fuse_req_t req, const char
3e1a43
     fprintf (stderr, "ovl_symlink(link=%s, ino=%" PRIu64 "s, name=%s)\n", link, parent, name);
3e1a43
 
3e1a43
   pnode = do_lookup_file (lo, parent, NULL);
3e1a43
-  if (pnode == NULL)
3e1a43
+  if (pnode == NULL || pnode->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -3896,7 +3902,7 @@ ovl_rename_exchange (fuse_req_t req, fus
3e1a43
   char *tmp;
3e1a43
 
3e1a43
   node = do_lookup_file (lo, parent, name);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -4255,7 +4261,7 @@ ovl_readlink (fuse_req_t req, fuse_ino_t
3e1a43
     fprintf (stderr, "ovl_readlink(ino=%" PRIu64 "s)\n", ino);
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -4661,7 +4667,7 @@ ovl_ioctl (fuse_req_t req, fuse_ino_t in
3e1a43
              ino, cmd, arg, fi, flags, in_buf, in_bufsz, out_bufsz);
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -4730,7 +4736,7 @@ ovl_fallocate (fuse_req_t req, fuse_ino_
3e1a43
              ino, mode, offset, length, fi);
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
@@ -4781,14 +4787,14 @@ ovl_copy_file_range (fuse_req_t req, fus
3e1a43
              ino_in, off_in, fi_in, ino_out, off_out, fi_out, len, flags);
3e1a43
 
3e1a43
   node = do_lookup_file (lo, ino_in, NULL);
3e1a43
-  if (node == NULL)
3e1a43
+  if (node == NULL || node->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;
3e1a43
     }
3e1a43
 
3e1a43
   dnode = do_lookup_file (lo, ino_out, NULL);
3e1a43
-  if (dnode == NULL)
3e1a43
+  if (dnode == NULL || dnode->whiteout)
3e1a43
     {
3e1a43
       fuse_reply_err (req, ENOENT);
3e1a43
       return;