diff options
author | Jeremy Allison <jra@samba.org> | 2011-08-18 14:11:45 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2011-08-19 00:43:04 +0200 |
commit | a6d06c069734cae037105350982545b6a964bbd8 (patch) | |
tree | c3b82668149ff1718fd0050b68b93a95118a7622 /source3/smbd/vfs.c | |
parent | 292fe7497134a9cc8f05844951547a2e8d14a4ac (diff) | |
download | samba-a6d06c069734cae037105350982545b6a964bbd8.tar.gz samba-a6d06c069734cae037105350982545b6a964bbd8.tar.bz2 samba-a6d06c069734cae037105350982545b6a964bbd8.zip |
Fix bug #8370 - vfs_chown_fsp broken -- returns in the wrong directory
Ensure we always use vfs_ChDir() to keep the singleton cache coherent.
Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Fri Aug 19 00:43:05 CEST 2011 on sn-devel-104
Diffstat (limited to 'source3/smbd/vfs.c')
-rw-r--r-- | source3/smbd/vfs.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index ed5009885b..c6edef282f 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -1501,7 +1501,7 @@ NTSTATUS vfs_chown_fsp(files_struct *fsp, uid_t uid, gid_t gid) } /* cd into the parent dir to pin it. */ - ret = SMB_VFS_CHDIR(fsp->conn, parent_dir); + ret = vfs_ChDir(fsp->conn, parent_dir); if (ret == -1) { return map_nt_error_from_unix(errno); } @@ -1512,12 +1512,14 @@ NTSTATUS vfs_chown_fsp(files_struct *fsp, uid_t uid, gid_t gid) /* Must use lstat here. */ ret = SMB_VFS_LSTAT(fsp->conn, &local_fname); if (ret == -1) { - return map_nt_error_from_unix(errno); + status = map_nt_error_from_unix(errno); + goto out; } /* Ensure it matches the fsp stat. */ if (!check_same_stat(&local_fname.st, &fsp->fsp_name->st)) { - return NT_STATUS_ACCESS_DENIED; + status = NT_STATUS_ACCESS_DENIED; + goto out; } path = final_component; } else { @@ -1540,6 +1542,8 @@ NTSTATUS vfs_chown_fsp(files_struct *fsp, uid_t uid, gid_t gid) status = map_nt_error_from_unix(errno); } + out: + if (as_root) { vfs_ChDir(fsp->conn,saved_dir); TALLOC_FREE(saved_dir); |