From: Andrew Bartlett Date: Sat, 18 Aug 2012 14:01:57 +0000 (+1000) Subject: s3-vfs: Correct the implementation of fake_acls_sys_acl_delete_def_file() X-Git-Tag: samba-4.0.0beta7~126 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cbe758cfbb8febd02c0a80bf8f813fd464c71ce5;p=thirdparty%2Fsamba.git s3-vfs: Correct the implementation of fake_acls_sys_acl_delete_def_file() --- diff --git a/source3/modules/vfs_fake_acls.c b/source3/modules/vfs_fake_acls.c index 19621586931..d7398a2ebff 100644 --- a/source3/modules/vfs_fake_acls.c +++ b/source3/modules/vfs_fake_acls.c @@ -306,8 +306,38 @@ static int fake_acls_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp static int fake_acls_sys_acl_delete_def_file(vfs_handle_struct *handle, const char *path) { + int ret; const char *name = FAKE_ACL_DEFAULT_XATTR; - return SMB_VFS_NEXT_REMOVEXATTR(handle, path, name); + TALLOC_CTX *frame = talloc_stackframe(); + struct smb_filename *smb_fname = NULL; + NTSTATUS status = create_synthetic_smb_fname_split(frame, path, NULL, + &smb_fname); + if (!NT_STATUS_IS_OK(status)) { + errno = map_errno_from_nt_status(status); + TALLOC_FREE(frame); + return -1; + } + + ret = SMB_VFS_NEXT_STAT(handle, smb_fname); + if (ret == -1) { + TALLOC_FREE(frame); + return -1; + } + + if (!S_ISDIR(smb_fname->st.st_ex_mode)) { + errno = EINVAL; + TALLOC_FREE(frame); + return -1; + } + + ret = SMB_VFS_NEXT_REMOVEXATTR(handle, path, name); + if (ret == -1 && errno == ENOATTR) { + ret = 0; + errno = 0; + } + + TALLOC_FREE(frame); + return ret; } static int fake_acls_chown(vfs_handle_struct *handle, const char *path, uid_t uid, gid_t gid)