summaryrefslogtreecommitdiffstats
path: root/tests/bugs/bug-1051896.c
diff options
context:
space:
mode:
authorVijay Bellur <vbellur@redhat.com>2014-01-12 22:39:14 +0530
committerAnand Avati <avati@redhat.com>2014-01-14 00:23:52 -0800
commit3af42583dd804371952d61e9d7ff4c640e67ba0d (patch)
tree33b82a76443753017a7f150c0d824f701328cf13 /tests/bugs/bug-1051896.c
parentaa3b01533efcd85fc1e654ac14a03ab8e1d5bbab (diff)
downloadglusterfs-3af42583dd804371952d61e9d7ff4c640e67ba0d.tar.gz
glusterfs-3af42583dd804371952d61e9d7ff4c640e67ba0d.tar.xz
glusterfs-3af42583dd804371952d61e9d7ff4c640e67ba0d.zip
storage/posix: UNWIND right op_error and op_errno in *setxattr()
1. errno was being set after gf_log() in posix_{f}handle_pair, this would cause errno to be overwritten. 2. dht would expect -1 for indication of failure in setxattr callback (dht_err_cbk()). posix_{f}setxattr has been changed to set op_ret as -1 instead of -op_errno. 3. dict_foreach() has been changed to return an error if the invoked fn() returns < 0. Bug report and test case credits to Zorro Lang <zlang@redhat.com> Change-Id: I96c15f12a5d7717b7584ba392f390a0b4f704a98 BUG: 1051896 Signed-off-by: Vijay Bellur <vbellur@redhat.com> Reviewed-on: http://review.gluster.org/6684 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Niels de Vos <ndevos@redhat.com> Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'tests/bugs/bug-1051896.c')
-rw-r--r--tests/bugs/bug-1051896.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/tests/bugs/bug-1051896.c b/tests/bugs/bug-1051896.c
new file mode 100644
index 0000000000..0ffd819864
--- /dev/null
+++ b/tests/bugs/bug-1051896.c
@@ -0,0 +1,94 @@
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <utime.h>
+#include <sys/acl.h>
+
+int do_setfacl(const char *path, const char *options, const char *textacl)
+{
+ int r;
+ int type;
+ acl_t acl;
+ int dob;
+ int dok;
+ int dom;
+ struct stat st;
+ char textmode[30];
+
+ r = 0;
+ dob = strchr(options,'b') != (char*)NULL;
+ dok = strchr(options,'k') != (char*)NULL;
+ dom = strchr(options,'m') != (char*)NULL;
+ if ((dom && !textacl)
+ || (!dom && (textacl || (!dok && !dob) ||
+ strchr(options,'d')))) {
+ errno = EBADRQC; /* "bad request" */
+ r = -1;
+ } else {
+ if (dob || dok) {
+ r = acl_delete_def_file(path);
+ }
+ if (dob && !r) {
+ if (!stat(path,&st)) {
+ sprintf(textmode,
+ "u::%c%c%c,g::%c%c%c,o::%c%c%c",
+ (st.st_mode & 0400 ? 'r' : '-'),
+ (st.st_mode & 0200 ? 'w' : '-'),
+ (st.st_mode & 0100 ? 'x' : '-'),
+ (st.st_mode & 0040 ? 'r' : '-'),
+ (st.st_mode & 0020 ? 'w' : '-'),
+ (st.st_mode & 0010 ? 'x' : '-'),
+ (st.st_mode & 004 ? 'r' : '-'),
+ (st.st_mode & 002 ? 'w' : '-'),
+ (st.st_mode & 001 ? 'x' : '-'));
+ acl = acl_from_text(textmode);
+ if (acl) {
+ r = acl_set_file(path,
+ ACL_TYPE_ACCESS,acl);
+ acl_free(acl);
+ } else
+ r = -1;
+ } else
+ r = -1;
+ }
+ if (!r && dom) {
+ if (strchr(options,'d'))
+ type = ACL_TYPE_DEFAULT;
+ else
+ type = ACL_TYPE_ACCESS;
+ acl = acl_from_text(textacl);
+ if (acl) {
+ r = acl_set_file(path,type,acl);
+ acl_free(acl);
+ } else
+ r = -1;
+ }
+ }
+ if (r)
+ r = -errno;
+ return (r);
+}
+
+
+int main(int argc, char *argv[]){
+ int rc = 0;
+ if (argc != 4) {
+ fprintf(stderr,
+ "usage: ./setfacl_test <path> <options> <textacl>\n");
+ return 0;
+ }
+ if ((rc = do_setfacl(argv[1], argv[2], argv[3])) != 0){
+ fprintf(stderr, "do_setfacl failed: %s\n", strerror(errno));
+ return rc;
+ }
+ return 0;
+}