diff options
Diffstat (limited to 'tests/bugs/access-control')
-rw-r--r-- | tests/bugs/access-control/bug-1051896.c | 97 | ||||
-rw-r--r-- | tests/bugs/access-control/bug-1051896.t | 34 | ||||
-rw-r--r-- | tests/bugs/access-control/bug-887098-gmount-crash.t | 42 | ||||
-rw-r--r-- | tests/bugs/access-control/bug-958691.t | 49 |
4 files changed, 222 insertions, 0 deletions
diff --git a/tests/bugs/access-control/bug-1051896.c b/tests/bugs/access-control/bug-1051896.c new file mode 100644 index 00000000000..27aa1559453 --- /dev/null +++ b/tests/bugs/access-control/bug-1051896.c @@ -0,0 +1,97 @@ +#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; + } + rc = do_setfacl(argv[1], argv[2], argv[3]); + if (rc != 0) { + fprintf(stderr, "do_setfacl failed: %s\n", strerror(errno)); + return rc; + } + return 0; +} diff --git a/tests/bugs/access-control/bug-1051896.t b/tests/bugs/access-control/bug-1051896.t new file mode 100644 index 00000000000..870ede7db21 --- /dev/null +++ b/tests/bugs/access-control/bug-1051896.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +case $OSTYPE in +NetBSD) + echo "Skip test on ACL which are not available on NetBSD" >&2 + SKIP_TESTS + exit 0 + ;; +*) + ;; +esac + +cleanup; + +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4}; +TEST $CLI volume start $V0; + +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --acl -s $H0 --volfile-id $V0 $M0; + +TEST touch $M0/file1; + +TEST $CC $(dirname $0)/bug-1051896.c -o $(dirname $0)/bug-1051896 -lacl +TEST ! $(dirname $0)/bug-1051896 $M0/file1 m 'u::r,u::w,g::r--,o::r--' +TEST rm -f $(dirname $0)/bug-1051896 + +cleanup diff --git a/tests/bugs/access-control/bug-887098-gmount-crash.t b/tests/bugs/access-control/bug-887098-gmount-crash.t new file mode 100644 index 00000000000..ba9937bd5bf --- /dev/null +++ b/tests/bugs/access-control/bug-887098-gmount-crash.t @@ -0,0 +1,42 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume info; + +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4}; + +## Verify volume is is created +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; + +## Start volume and verify +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +TEST glusterfs -s $H0 --volfile-id=$V0 --acl $M0 +MOUNT_PID=$(get_mount_process_pid $V0) + +for i in {1..25}; +do + mkdir $M0/tmp_$i && cat /etc/hosts > $M0/tmp_$i/file + cp -RPp $M0/tmp_$i $M0/newtmp_$i && cat /etc/hosts > $M0/newtmp_$i/newfile +done + +EXPECT "$MOUNT_PID" get_mount_process_pid $V0 +TEST rm -rf $M0/* +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +## Finish up +TEST $CLI volume stop $V0; +EXPECT 'Stopped' volinfo_field $V0 'Status'; + +TEST $CLI volume delete $V0; + +cleanup; diff --git a/tests/bugs/access-control/bug-958691.t b/tests/bugs/access-control/bug-958691.t new file mode 100644 index 00000000000..9db858da2d2 --- /dev/null +++ b/tests/bugs/access-control/bug-958691.t @@ -0,0 +1,49 @@ +#!/bin/bash +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../nfs.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1} +TEST $CLI volume start $V0; + +TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0; +EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available; +TEST mount_nfs $H0:/$V0 $N0 nolock; + +# Tests for the fuse mount +TEST mkdir $M0/dir; +TEST chmod 1777 $M0/dir; +TEST touch $M0/dir/file{1,2}; + +TEST $CLI volume set $V0 server.root-squash enable; + +mv $M0/dir/file1 $M0/dir/file11 2>/dev/null; +TEST [ $? -ne 0 ]; + +TEST $CLI volume set $V0 server.root-squash disable; +TEST rm -rf $M0/dir; + +sleep 1; + +# tests for nfs mount +TEST mkdir $N0/dir; +TEST chmod 1777 $N0/dir; +TEST touch $N0/dir/file{1,2}; + +TEST $CLI volume set $V0 server.root-squash enable; + +mv $N0/dir/file1 $N0/dir/file11 2>/dev/null; +TEST [ $? -ne 0 ]; + +TEST $CLI volume set $V0 server.root-squash disable; +TEST rm -rf $N0/dir; +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0 + +TEST $CLI volume stop $V0; +TEST $CLI volume delete $V0; + +cleanup; |