diff options
author | Pranith K <pranithk@gluster.com> | 2011-01-24 01:49:23 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2011-01-26 23:42:21 -0800 |
commit | 40cdb88962cff1d32cd46cb089ad8bcd9be3d62d (patch) | |
tree | 44690b776d266e1253a9d84f714e6d72013713fd | |
parent | 945ac04532d5efeeef324be485dcf2bade41708e (diff) |
features/access-control: skip access-tests if the call is from fuse
Fuse cant send aux gids. So access-control checks treat
non-primary-group membership of user as "other". So skip
access-control checks if the call is from fuse. We added a hack to
treat all calls with pid set to 1 as calls from nfs. So for calls with pid
not 1 we skip the access-control checks on all fops.
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 2296 (svn / subversion fails on gluster volume (replicated and non-replicated))
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2296
-rw-r--r-- | libglusterfs/src/stack.c | 11 | ||||
-rw-r--r-- | libglusterfs/src/stack.h | 3 | ||||
-rw-r--r-- | xlators/features/access-control/src/access-control.c | 76 | ||||
-rw-r--r-- | xlators/nfs/server/src/nfs-fops.c | 1 |
4 files changed, 90 insertions, 1 deletions
diff --git a/libglusterfs/src/stack.c b/libglusterfs/src/stack.c index b2659c57fe3..53c21f7c625 100644 --- a/libglusterfs/src/stack.c +++ b/libglusterfs/src/stack.c @@ -163,3 +163,14 @@ gf_proc_dump_pending_frames (call_pool_t *call_pool) UNLOCK (&(call_pool->lock)); } +gf_boolean_t +__is_fuse_call (call_frame_t *frame) +{ + gf_boolean_t is_fuse_call = _gf_false; + GF_ASSERT (frame); + GF_ASSERT (frame->root); + + if (NFS_PID != frame->root->pid) + is_fuse_call = _gf_true; + return is_fuse_call; +} diff --git a/libglusterfs/src/stack.h b/libglusterfs/src/stack.h index b06470bf5fc..f06267c3848 100644 --- a/libglusterfs/src/stack.h +++ b/libglusterfs/src/stack.h @@ -45,6 +45,7 @@ typedef struct _call_pool_t call_pool_t; #include "common-utils.h" #include "globals.h" +#define NFS_PID 1 typedef int32_t (*ret_fn_t) (call_frame_t *frame, call_frame_t *prev_frame, xlator_t *this, @@ -363,4 +364,6 @@ create_frame (xlator_t *xl, call_pool_t *pool) void gf_proc_dump_pending_frames(call_pool_t *call_pool); +gf_boolean_t +__is_fuse_call (call_frame_t *frame); #endif /* _STACK_H */ diff --git a/xlators/features/access-control/src/access-control.c b/xlators/features/access-control/src/access-control.c index 802d7cf6f7f..7b5689dace6 100644 --- a/xlators/features/access-control/src/access-control.c +++ b/xlators/features/access-control/src/access-control.c @@ -52,7 +52,6 @@ __get_frame_stub (call_frame_t *fr) return st; } - int ac_test_owner_access (struct iatt *ia, uid_t uid, int accesstest) { @@ -372,6 +371,10 @@ ac_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset) call_stub_t *stub = NULL; int ret = -EFAULT; + if (__is_fuse_call (frame)) { + ac_truncate_resume (frame, this, loc, offset); + return 0; + } stub = fop_truncate_stub (frame, ac_truncate_resume, loc, offset); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -459,6 +462,10 @@ ac_access (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask) call_stub_t *stub = NULL; int ret = -EFAULT; + if (__is_fuse_call (frame)) { + ac_access_resume (frame, this, loc, mask); + return 0; + } stub = fop_access_stub (frame, ac_access_resume, loc, mask); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -524,6 +531,10 @@ ac_readlink (call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size) call_stub_t *stub = NULL; int ret = -EFAULT; + if (__is_fuse_call (frame)) { + ac_readlink_resume (frame, this, loc, size); + return 0; + } stub = fop_readlink_stub (frame, ac_readlink_resume, loc, size); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -594,6 +605,10 @@ ac_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, int ret = -EFAULT; loc_t parentloc = {0, }; + if (__is_fuse_call (frame)) { + ac_mknod_resume (frame, this, loc, mode, rdev, params); + return 0; + } stub = fop_mknod_stub (frame, ac_mknod_resume, loc, mode, rdev, params); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -679,6 +694,10 @@ ac_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, int ret = -EFAULT; loc_t parentloc = {0, }; + if (__is_fuse_call (frame)) { + ac_mkdir_resume (frame, this, loc, mode, params); + return 0; + } stub = fop_mkdir_stub (frame, ac_mkdir_resume, loc, mode, params); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -757,6 +776,10 @@ ac_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc) int ret = -EFAULT; loc_t parentloc = {0, }; + if (__is_fuse_call (frame)) { + ac_unlink_resume (frame, this, loc); + return 0; + } stub = fop_unlink_stub (frame, ac_unlink_resume, loc); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -834,6 +857,10 @@ ac_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags) int ret = -EFAULT; loc_t parentloc = {0, }; + if (__is_fuse_call (frame)) { + ac_rmdir_resume (frame, this, loc, flags); + return 0; + } stub = fop_rmdir_stub (frame, ac_rmdir_resume, loc, flags); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -914,6 +941,10 @@ ac_symlink (call_frame_t *frame, xlator_t *this, const char *linkname, int ret = -EFAULT; loc_t parentloc = {0, }; + if (__is_fuse_call (frame)) { + ac_symlink_resume (frame, this, linkname, loc, params); + return 0; + } stub = fop_symlink_stub (frame, ac_symlink_resume, linkname, loc, params); if (!stub) { @@ -1040,6 +1071,10 @@ ac_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc) int ret = -EFAULT; loc_t parentloc = {0, }; + if (__is_fuse_call (frame)) { + ac_rename_resume (frame, this, oldloc, newloc); + return 0; + } stub = fop_rename_stub (frame, ac_rename_resume, oldloc, newloc); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -1125,6 +1160,10 @@ ac_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc) int ret = -EFAULT; loc_t parentloc = {0, }; + if (__is_fuse_call (frame)) { + ac_link_resume (frame, this, oldloc, newloc); + return 0; + } stub = fop_link_stub (frame, ac_link_resume, oldloc, newloc); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -1207,6 +1246,10 @@ ac_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, int ret = -EFAULT; loc_t parentloc = {0, }; + if (__is_fuse_call (frame)) { + ac_create_resume (frame, this, loc, flags, mode, fd, params); + return 0; + } stub = fop_create_stub (frame, ac_create_resume, loc, flags, mode, fd, params); if (!stub) { @@ -1366,6 +1409,11 @@ ac_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, call_stub_t *stub = NULL; int ret = -EFAULT; + if (__is_fuse_call (frame)) { + ret = ac_open_resume (frame, this, loc, flags, fd, wbflags); + return 0; + } + stub = fop_open_stub (frame, ac_open_resume, loc, flags, fd, wbflags); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -1443,6 +1491,11 @@ ac_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, call_stub_t *stub = NULL; int ret = -EFAULT; + if (__is_fuse_call (frame)) { + ret = ac_readv_resume (frame, this, fd, size, offset); + return 0; + } + stub = fop_readv_stub (frame, ac_readv_resume, fd, size, offset); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -1514,6 +1567,12 @@ ac_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector, call_stub_t *stub = NULL; int ret = -EFAULT; + if (__is_fuse_call (frame)) { + ret = ac_writev_resume (frame, this, fd, vector, count, + offset, iobref); + return 0; + } + stub = fop_writev_stub (frame, ac_writev_resume, fd, vector, count, offset, iobref); if (!stub) { @@ -1578,6 +1637,11 @@ ac_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd) call_stub_t *stub = NULL; int ret = -EFAULT; + if (__is_fuse_call (frame)) { + ret = ac_opendir_resume (frame, this, loc, fd); + return 0; + } + stub = fop_opendir_stub (frame, ac_opendir_resume, loc, fd); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -1683,6 +1747,11 @@ ac_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *buf, call_stub_t *stub = NULL; int ret = -EFAULT; + if (__is_fuse_call (frame)) { + ret = ac_setattr_resume (frame, this, loc, buf, valid); + return 0; + } + stub = fop_setattr_stub (frame, ac_setattr_resume, loc, buf, valid); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " @@ -1789,6 +1858,11 @@ ac_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *buf, call_stub_t *stub = NULL; int ret = -EFAULT; + if (__is_fuse_call (frame)) { + ret = ac_fsetattr_resume (frame, this, fd, buf, valid); + return 0; + } + stub = fop_fsetattr_stub (frame, ac_fsetattr_resume, fd, buf, valid); if (!stub) { gf_log (this->name, GF_LOG_ERROR, "cannot create call stub: " diff --git a/xlators/nfs/server/src/nfs-fops.c b/xlators/nfs/server/src/nfs-fops.c index cf74708f886..068d08cf3b5 100644 --- a/xlators/nfs/server/src/nfs-fops.c +++ b/xlators/nfs/server/src/nfs-fops.c @@ -122,6 +122,7 @@ nfs_create_frame (xlator_t *xl, nfs_user_t *nfu) frame = create_frame (xl, (call_pool_t *)xl->ctx->pool); if (!frame) goto err; + frame->root->pid = NFS_PID; frame->root->uid = nfu->uid; frame->root->gid = nfu->gids[NFS_PRIMGID_IDX]; if (nfu->ngrps == 1) |