summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2011-08-18 14:11:45 -0700
committerJeremy Allison <jra@samba.org>2011-08-19 00:43:04 +0200
commita6d06c069734cae037105350982545b6a964bbd8 (patch)
treec3b82668149ff1718fd0050b68b93a95118a7622
parent292fe7497134a9cc8f05844951547a2e8d14a4ac (diff)
downloadsamba-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
-rw-r--r--source3/modules/vfs_acl_common.c13
-rw-r--r--source3/smbd/vfs.c10
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);