From 6aafd8684b92eede3c83f1af49c23cef2deb7e03 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 10 Jan 2012 12:52:01 -0800 Subject: [PATCH] First part of fix for bug #8673 - NT ACL issue. Simplify the logic in the unlink/rmdir calls - makes it readable (and correct). --- source3/modules/vfs_acl_common.c | 49 +++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/source3/modules/vfs_acl_common.c b/source3/modules/vfs_acl_common.c index bf535c557bd..e162bb9823c 100644 --- a/source3/modules/vfs_acl_common.c +++ b/source3/modules/vfs_acl_common.c @@ -647,17 +647,23 @@ static int rmdir_acl_common(struct vfs_handle_struct *handle, { int ret; + /* Try the normal rmdir first. */ ret = SMB_VFS_NEXT_RMDIR(handle, path); - if (!(ret == -1 && (errno == EACCES || errno == EPERM))) { - DEBUG(10,("rmdir_acl_common: unlink of %s failed %s\n", - path, - strerror(errno) )); - return ret; + if (ret == 0) { + return 0; + } + if (errno == EACCES || errno == EPERM) { + /* Failed due to access denied, + see if we need to root override. */ + return acl_common_remove_object(handle, + path, + true); } - return acl_common_remove_object(handle, - path, - true); + DEBUG(10,("rmdir_acl_common: unlink of %s failed %s\n", + path, + strerror(errno) )); + return -1; } static int unlink_acl_common(struct vfs_handle_struct *handle, @@ -665,21 +671,28 @@ static int unlink_acl_common(struct vfs_handle_struct *handle, { int ret; + /* Try the normal unlink first. */ ret = SMB_VFS_NEXT_UNLINK(handle, smb_fname); - if (!(ret == -1 && (errno == EACCES || errno == EPERM))) { - DEBUG(10,("unlink_acl_common: unlink of %s failed %s\n", - smb_fname->base_name, - strerror(errno) )); - return ret; - } - /* Don't do anything fancy for streams. */ - if (smb_fname->stream_name) { - return ret; + if (ret == 0) { + return 0; } + if (errno == EACCES || errno == EPERM) { + /* Failed due to access denied, + see if we need to root override. */ - return acl_common_remove_object(handle, + /* Don't do anything fancy for streams. */ + if (smb_fname->stream_name) { + return -1; + } + return acl_common_remove_object(handle, smb_fname->base_name, false); + } + + DEBUG(10,("unlink_acl_common: unlink of %s failed %s\n", + smb_fname->base_name, + strerror(errno) )); + return -1; } static int chmod_acl_module_common(struct vfs_handle_struct *handle, -- 2.11.4.GIT