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 | |
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')
-rw-r--r-- | source3/modules/vfs_acl_common.c | 13 | ||||
-rw-r--r-- | source3/smbd/vfs.c | 10 |
2 files changed, 18 insertions, 5 deletions
diff --git a/source3/modules/vfs_acl_common.c b/source3/modules/vfs_acl_common.c index b01fd18b9b..a4d712f525 100644 --- a/source3/modules/vfs_acl_common.c +++ b/source3/modules/vfs_acl_common.c @@ -831,6 +831,13 @@ static int acl_common_remove_object(vfs_handle_struct *handle, const char *final_component = NULL; struct smb_filename local_fname; int saved_errno = 0; + char *saved_dir = NULL; + + saved_dir = vfs_GetWd(talloc_tos(),conn); + if (!saved_dir) { + saved_errno = errno; + goto out; + } if (!parent_dirname(talloc_tos(), path, &parent_dir, &final_component)) { @@ -843,7 +850,7 @@ static int acl_common_remove_object(vfs_handle_struct *handle, parent_dir, final_component )); /* cd into the parent dir to pin it. */ - ret = SMB_VFS_CHDIR(conn, parent_dir); + ret = vfs_ChDir(conn, parent_dir); if (ret == -1) { saved_errno = errno; goto out; @@ -897,7 +904,9 @@ static int acl_common_remove_object(vfs_handle_struct *handle, TALLOC_FREE(parent_dir); - vfs_ChDir(conn, conn->connectpath); + if (saved_dir) { + vfs_ChDir(conn, saved_dir); + } if (saved_errno) { errno = saved_errno; } 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); |