diff options
| author | Ravishankar N <ranaraya@redhat.com> | 2014-01-29 12:09:42 +0000 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2014-02-11 22:13:29 -0800 | 
| commit | 8148dc2eab154e94d2c9e041cc0abbba9845ce51 (patch) | |
| tree | f93430b43f8721fe80330f4fbf3456c386f37248 /xlators | |
| parent | 99c84c250501a676f73c0dd7e9b842f8c95b1f98 (diff) | |
storage/posix: perform chmod after chown.
Problem:
When a replica brick is added to a volume, set-user-ID and set-group-ID
permission bits of files are not set correctly in the new brick. The issue
is in the posix_setattr() call where we do a chmod followed by a chown.
But according to the man pages for chown:
When the owner or group of an executable file are changed by an unprivileged
user the S_ISUID and S_ISGID mode bits are cleared.  POSIX does not specify
whether this also  should  happen  when  root does the chown().
Fix:
Swap the chmod and chown calls in posix_setattr()
Change-Id: I094e47a995c210d2fdbc23ae7a5718286e7a9cf8
BUG: 1058797
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/6862
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 12 | 
1 files changed, 6 insertions, 6 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index fde322099..890e51197 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -362,23 +362,23 @@ posix_setattr (call_frame_t *frame, xlator_t *this,                  goto out;          } -        if (valid & GF_SET_ATTR_MODE) { -                op_ret = posix_do_chmod (this, real_path, stbuf); +        if (valid & (GF_SET_ATTR_UID | GF_SET_ATTR_GID)){ +                op_ret = posix_do_chown (this, real_path, stbuf, valid);                  if (op_ret == -1) {                          op_errno = errno;                          gf_log (this->name, GF_LOG_ERROR, -                                "setattr (chmod) on %s failed: %s", real_path, +                                "setattr (chown) on %s failed: %s", real_path,                                  strerror (op_errno));                          goto out;                  }          } -        if (valid & (GF_SET_ATTR_UID | GF_SET_ATTR_GID)){ -                op_ret = posix_do_chown (this, real_path, stbuf, valid); +        if (valid & GF_SET_ATTR_MODE) { +                op_ret = posix_do_chmod (this, real_path, stbuf);                  if (op_ret == -1) {                          op_errno = errno;                          gf_log (this->name, GF_LOG_ERROR, -                                "setattr (chown) on %s failed: %s", real_path, +                                "setattr (chmod) on %s failed: %s", real_path,                                  strerror (op_errno));                          goto out;                  }  | 
