Fix bug #7987 - ACL can get lost when files are being renamed.
authorJeremy Allison <jra@samba.org>
Fri, 1 Apr 2011 23:50:28 +0000 (16:50 -0700)
committerJeremy Allison <jra@samba.org>
Mon, 4 Apr 2011 00:13:56 +0000 (17:13 -0700)
There is no reason for smbd with Windows ACLs to use chmod
or fchmod unless it's a file opened with UNIX extensions or
with posix pathnames.

Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Sat Apr  2 02:40:43 CEST 2011 on sn-devel-104
(cherry picked from commit 00224d06c389e9744b83bcec09a9d002086058fc)

source3/modules/vfs_acl_common.c
source3/modules/vfs_acl_tdb.c
source3/modules/vfs_acl_xattr.c

index e01ac4ec5f38c28d824f584e0d0731a3837ecb35..368f4203e6a1eb3d1c24751005a76b2eacee4741 100644 (file)
@@ -1018,3 +1018,43 @@ static int unlink_acl_common(struct vfs_handle_struct *handle,
                                        smb_fname->base_name,
                                        false);
 }
+
+static int chmod_acl_module_common(struct vfs_handle_struct *handle,
+                       const char *path, mode_t mode)
+{
+       if (lp_posix_pathnames()) {
+               /* Only allow this on POSIX pathnames. */
+               return SMB_VFS_NEXT_CHMOD(handle, path, mode);
+       }
+       return 0;
+}
+
+static int fchmod_acl_module_common(struct vfs_handle_struct *handle,
+                       struct files_struct *fsp, mode_t mode)
+{
+       if (fsp->posix_open) {
+               /* Only allow this on POSIX opens. */
+               return SMB_VFS_NEXT_FCHMOD(handle, fsp, mode);
+       }
+       return 0;
+}
+
+static int chmod_acl_acl_module_common(struct vfs_handle_struct *handle,
+                       const char *name, mode_t mode)
+{
+       if (lp_posix_pathnames()) {
+               /* Only allow this on POSIX pathnames. */
+               return SMB_VFS_NEXT_CHMOD_ACL(handle, name, mode);
+       }
+       return 0;
+}
+
+static int fchmod_acl_acl_module_common(struct vfs_handle_struct *handle,
+                       struct files_struct *fsp, mode_t mode)
+{
+       if (fsp->posix_open) {
+               /* Only allow this on POSIX opens. */
+               return SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, mode);
+       }
+       return 0;
+}
index 5fc1bc03f2228465b4321bce163495c181a3356c..3e5abd9f7b6f8f8957d6c277c77e562111bd0e81 100644 (file)
@@ -398,13 +398,17 @@ static struct vfs_fn_pointers vfs_acl_tdb_fns = {
        .disconnect = disconnect_acl_tdb,
        .opendir = opendir_acl_common,
        .mkdir = mkdir_acl_common,
+       .rmdir = rmdir_acl_tdb,
        .open = open_acl_common,
        .create_file = create_file_acl_common,
        .unlink = unlink_acl_tdb,
-       .rmdir = rmdir_acl_tdb,
+       .chmod = chmod_acl_module_common,
+       .fchmod = fchmod_acl_module_common,
        .fget_nt_acl = fget_nt_acl_common,
        .get_nt_acl = get_nt_acl_common,
        .fset_nt_acl = fset_nt_acl_common,
+       .chmod_acl = chmod_acl_acl_module_common,
+       .fchmod_acl = fchmod_acl_acl_module_common,
        .sys_acl_set_file = sys_acl_set_file_tdb,
        .sys_acl_set_fd = sys_acl_set_fd_tdb
 };
index aa7aeae5f45e2b370b7b765439fe0d99e3415f1d..0609d7fb99045c52c75e45cbeae7cc5947590b68 100644 (file)
@@ -207,9 +207,13 @@ static struct vfs_fn_pointers vfs_acl_xattr_fns = {
        .open = open_acl_common,
        .create_file = create_file_acl_common,
        .unlink = unlink_acl_common,
+       .chmod = chmod_acl_module_common,
+       .fchmod = fchmod_acl_module_common,
        .fget_nt_acl = fget_nt_acl_common,
        .get_nt_acl = get_nt_acl_common,
        .fset_nt_acl = fset_nt_acl_common,
+       .chmod_acl = chmod_acl_acl_module_common,
+       .fchmod_acl = fchmod_acl_acl_module_common,
        .sys_acl_set_file = sys_acl_set_file_xattr,
        .sys_acl_set_fd = sys_acl_set_fd_xattr
 };