summaryrefslogtreecommitdiff
path: root/usr/src/common/acl/acl_common.c
diff options
context:
space:
mode:
authorKevin Crowe <kevin.crowe@nexenta.com>2016-03-19 23:20:46 +0300
committerMatthew Ahrens <mahrens@delphix.com>2016-04-20 08:33:38 -0700
commit1eb4e906ec75b9bde421954ace46ef137b0fc9eb (patch)
treec010fb055ef7a8b62c243f5e14ca4f1298fd07c8 /usr/src/common/acl/acl_common.c
parent380fd671753dd199e149f10e9f73ec52cdfe4230 (diff)
downloadillumos-gate-1eb4e906ec75b9bde421954ace46ef137b0fc9eb.tar.gz
6762 POSIX write should imply DELETE_CHILD on directories - and some additional considerations
Reviewed by: Gordon Ross <gwr@nexenta.com> Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com> Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/common/acl/acl_common.c')
-rw-r--r--usr/src/common/acl/acl_common.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/usr/src/common/acl/acl_common.c b/usr/src/common/acl/acl_common.c
index 6cfcb77937..ac73beace3 100644
--- a/usr/src/common/acl/acl_common.c
+++ b/usr/src/common/acl/acl_common.c
@@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
*/
#include <sys/types.h>
@@ -1578,7 +1578,8 @@ acl_trivial_access_masks(mode_t mode, boolean_t isdir, trivial_acl_t *masks)
uint32_t write_mask = ACE_WRITE_DATA|ACE_APPEND_DATA;
uint32_t execute_mask = ACE_EXECUTE;
- (void) isdir; /* will need this later */
+ if (isdir)
+ write_mask |= ACE_DELETE_CHILD;
masks->deny1 = 0;
if (!(mode & S_IRUSR) && (mode & (S_IRGRP|S_IROTH)))
@@ -1722,10 +1723,17 @@ ace_trivial_common(void *acep, int aclcnt,
return (1);
/*
- * Delete permissions are never set by default
+ * Delete permission is never set by default
+ */
+ if (mask & ACE_DELETE)
+ return (1);
+
+ /*
+ * Child delete permission should be accompanied by write
*/
- if (mask & (ACE_DELETE|ACE_DELETE_CHILD))
+ if ((mask & ACE_DELETE_CHILD) && !(mask & ACE_WRITE_DATA))
return (1);
+
/*
* only allow owner@ to have
* write_acl/write_owner/write_attributes/write_xattr/