Blob Blame History Raw
From 5ca2d704347662adcb6a030c35e1087e79fb883f Mon Sep 17 00:00:00 2001
From: Pranith Kumar K <pkarampu@redhat.com>
Date: Thu, 8 Sep 2016 05:43:20 +0530
Subject: [PATCH 101/141] system/posix-acl: Unwind with NULL xdata on error

In posix-acl when there are errors xdata that comes as part of input is used to
unwind which can be used as response xdata which may lead to problems as the
keys in the input will match with keys in the output but the values the
response xdata may expect can be completely different.

For example, we see that dht sends DHT_IATT_IN_XDATA_KEY in setxattr
which will be unwound with the same key in the xdata-response which
dht thinks is valid response and fills stbuf with invalid values
leading to EIO

> BUG: 1374093
> Change-Id: I6b77a1fa1ee99cb62e181e1db2e6fea73f6eaaa3
> Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
> Reviewed-on: http://review.gluster.org/15421
> Smoke: Gluster Build System <jenkins@build.gluster.org>
> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
> Reviewed-by: jiffin tony Thottan <jthottan@redhat.com>
> Reviewed-by: Niels de Vos <ndevos@redhat.com>
(cherry picked from commit c9271ff14d3efa8279cf67907548b3f43970d4fb)

BUG: 1374568
Change-Id: I79fb34158169b705ca676b68093cdde3ab14e3f1
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/87187
---
 xlators/system/posix-acl/src/posix-acl.c |   36 +++++++++++++++--------------
 1 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/xlators/system/posix-acl/src/posix-acl.c b/xlators/system/posix-acl/src/posix-acl.c
index 3f4d40a..f3666ef 100644
--- a/xlators/system/posix-acl/src/posix-acl.c
+++ b/xlators/system/posix-acl/src/posix-acl.c
@@ -1128,7 +1128,7 @@ green:
                     loc, flags, fd, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (open, frame, -1, EACCES, NULL, xdata);
+        STACK_UNWIND_STRICT (open, frame, -1, EACCES, NULL, NULL);
         return 0;
 }
 
@@ -1163,7 +1163,8 @@ green:
                     fd, size, offset, flags, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (readv, frame, -1, EACCES, NULL, 0, NULL, NULL, xdata);
+        STACK_UNWIND_STRICT (readv, frame, -1, EACCES, NULL, 0, NULL, NULL,
+                             NULL);
         return 0;
 }
 
@@ -1198,7 +1199,7 @@ green:
                     fd, vector, count, offset, flags, iobref, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (writev, frame, -1, EACCES, NULL, NULL, xdata);
+        STACK_UNWIND_STRICT (writev, frame, -1, EACCES, NULL, NULL, NULL);
         return 0;
 }
 
@@ -1233,7 +1234,7 @@ green:
                     fd, offset, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (ftruncate, frame, -1, EACCES, NULL, NULL, xdata);
+        STACK_UNWIND_STRICT (ftruncate, frame, -1, EACCES, NULL, NULL, NULL);
         return 0;
 }
 
@@ -1261,7 +1262,7 @@ green:
                     loc, fd, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (opendir, frame, -1, EACCES, NULL, xdata);
+        STACK_UNWIND_STRICT (opendir, frame, -1, EACCES, NULL, NULL);
         return 0;
 }
 
@@ -1428,7 +1429,7 @@ green:
         return 0;
 red:
         STACK_UNWIND_STRICT (symlink, frame, -1, EACCES, NULL, NULL, NULL,
-                             NULL, xdata);
+                             NULL, NULL);
         return 0;
 }
 
@@ -1464,7 +1465,7 @@ green:
                     loc, xflag, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (unlink, frame, -1, EACCES, NULL, NULL, xdata);
+        STACK_UNWIND_STRICT (unlink, frame, -1, EACCES, NULL, NULL, NULL);
         return 0;
 }
 
@@ -1499,7 +1500,7 @@ green:
                     loc, flags, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (rmdir, frame, -1, EACCES, NULL, NULL, xdata);
+        STACK_UNWIND_STRICT (rmdir, frame, -1, EACCES, NULL, NULL, NULL);
         return 0;
 }
 
@@ -1590,7 +1591,8 @@ posix_acl_link (call_frame_t *frame, xlator_t *this, loc_t *old, loc_t *new, dic
                     old, new, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (link, frame, -1, op_errno, NULL, NULL, NULL, NULL, xdata);
+        STACK_UNWIND_STRICT (link, frame, -1, op_errno, NULL, NULL, NULL, NULL,
+                             NULL);
 
         return 0;
 }
@@ -1623,7 +1625,7 @@ green:
                     fd, size, offset, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (readdir, frame, -1, EACCES, NULL, xdata);
+        STACK_UNWIND_STRICT (readdir, frame, -1, EACCES, NULL, NULL);
 
         return 0;
 }
@@ -1855,7 +1857,7 @@ posix_acl_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
                     loc, buf, valid, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (setattr, frame, -1, op_errno, NULL, NULL, xdata);
+        STACK_UNWIND_STRICT (setattr, frame, -1, op_errno, NULL, NULL, NULL);
 
         return 0;
 }
@@ -1901,7 +1903,7 @@ posix_acl_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,
                     fd, buf, valid, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (fsetattr, frame, -1, EACCES, NULL, NULL, xdata);
+        STACK_UNWIND_STRICT (fsetattr, frame, -1, EACCES, NULL, NULL, NULL);
 
         return 0;
 }
@@ -2097,7 +2099,7 @@ posix_acl_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,
                            loc, xattr, flags, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (setxattr, frame, -1, op_errno, xdata);
+        STACK_UNWIND_STRICT (setxattr, frame, -1, op_errno, NULL);
 
         return 0;
 }
@@ -2131,7 +2133,7 @@ posix_acl_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd,
                     fd, xattr, flags, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (fsetxattr, frame, -1, op_errno, xdata);
+        STACK_UNWIND_STRICT (fsetxattr, frame, -1, op_errno, NULL);
 
         return 0;
 }
@@ -2166,7 +2168,7 @@ green:
         return 0;
 
 red:
-        STACK_UNWIND_STRICT (getxattr, frame, -1, EACCES, NULL, xdata);
+        STACK_UNWIND_STRICT (getxattr, frame, -1, EACCES, NULL, NULL);
 
         return 0;
 }
@@ -2199,7 +2201,7 @@ green:
                     fd, name, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (fgetxattr, frame, -1, EACCES, NULL, xdata);
+        STACK_UNWIND_STRICT (fgetxattr, frame, -1, EACCES, NULL, NULL);
 
         return 0;
 }
@@ -2248,7 +2250,7 @@ green:
                     loc, name, xdata);
         return 0;
 red:
-        STACK_UNWIND_STRICT (removexattr, frame, -1, op_errno, xdata);
+        STACK_UNWIND_STRICT (removexattr, frame, -1, op_errno, NULL);
 
         return 0;
 }
-- 
1.7.1