From 2481925ea7fcbac7cc60f511379157afdcbca9c7 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Fri, 23 Sep 2016 21:06:37 +0530 Subject: [PATCH 109/141] storage/posix: Fix race in posix_pstat Problem: When one thread is in the process of creating a file/directory and the other thread is doing readdirp, there is a chance that posix_pstat, creation fops race in the following manner which will lead to wrong stat values to be read by parent xlators like posix-acl. Creation fops posix_pstat() as part of readdirp 1) file is created with uid/gid 0/0 1) does stat of the path that is created just now. 2) Does chown to set the correct uid/gid 3) Sets the acl/user/internal xattrs 4) Sets the gfid on the entry and completes the creation of the file/dir 2) fills the gfid in the iatt If unwind of readdirp hits server xlator before creation fop, then posix-acl remembers uid/gid of the file to be root/root and fails fops like open etc on it. Fix: Reverse the order of filling gfid and filling lstat() values in posix_pstat() so that if there is gfid in iatt buffer uid/gid are valid. >Change-Id: I46caa7f6da7abfa40a0b1d70e35b88de9c64959c >Signed-off-by: Pranith Kumar K >Reviewed-on: http://review.gluster.org/15564 >NetBSD-regression: NetBSD Build System >CentOS-regression: Gluster Build System >Smoke: Gluster Build System >Reviewed-by: Shyamsundar Ranganathan BUG: 1339765 Change-Id: Id14a37eb5b71d9d8eb28ae83079047c23ab6f51f Signed-off-by: Pranith Kumar K Reviewed-on: https://code.engineering.redhat.com/gerrit/87555 Reviewed-by: Atin Mukherjee Tested-by: Atin Mukherjee --- xlators/storage/posix/src/posix-helpers.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 86c3339..2912896 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -640,6 +640,11 @@ posix_pstat (xlator_t *this, uuid_t gfid, const char *path, priv = this->private; + if (gfid && !gf_uuid_is_null (gfid)) + gf_uuid_copy (stbuf.ia_gfid, gfid); + else + posix_fill_gfid_path (this, path, &stbuf); + ret = sys_lstat (path, &lstatbuf); if (ret != 0) { @@ -672,11 +677,6 @@ posix_pstat (xlator_t *this, uuid_t gfid, const char *path, iatt_from_stat (&stbuf, &lstatbuf); - if (gfid && !gf_uuid_is_null (gfid)) - gf_uuid_copy (stbuf.ia_gfid, gfid); - else - posix_fill_gfid_path (this, path, &stbuf); - posix_fill_ino_from_gfid (this, &stbuf); if (buf_p) -- 1.7.1