s3-vfs: Fix vfs_chown_fsp.
authorJeremy Allison <jra@samba.org>
Sat, 20 Aug 2011 18:47:40 +0000 (20:47 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 11 Oct 2011 13:33:16 +0000 (15:33 +0200)
Fix bug #8370 (vfs_chown_fsp broken -- returns in the wrong directory).

source3/modules/vfs_acl_common.c
source3/smbd/vfs.c

index 0dd2fc3543aa82b4c651e29062016ea706419c96..b6fcbb09dde7af990f579fe984c93e799fe3194b 100644 (file)
@@ -830,6 +830,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)) {
@@ -842,7 +849,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;
@@ -896,7 +903,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;
        }
index bdcb8e4a0a8d87f3c9dd13923ba58654043e63a1..35a8331e8d8e0cfe4bf0c2501664c2d479f281e6 100644 (file)
@@ -1500,7 +1500,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);
                }
@@ -1511,12 +1511,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 {
@@ -1539,6 +1541,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);