From: Martin Matuska Date: Sun, 15 Jan 2017 00:56:26 +0000 (+0100) Subject: Fix sun_acl_is_trivial() for directories X-Git-Tag: v3.3.0~51 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c425dc02325da24fb6d22607dfa8966122210a53;p=thirdparty%2Flibarchive.git Fix sun_acl_is_trivial() for directories Directory write permission includes ACE_DELETE_CHILD on Solaris --- diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index 7a8b7b5f9..7b201bd3b 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -665,7 +665,7 @@ static struct { static int sun_acl_is_trivial(acl_t *acl, mode_t mode, int *trivialp) { - uint32_t pubset, ownset; + uint32_t pubset, ownset, rperm, wperm, eperm; uint32_t o_allow_pre, o_allow, g_allow, e_allow; uint32_t o_deny, g_deny; int i; @@ -705,47 +705,54 @@ sun_acl_is_trivial(acl_t *acl, mode_t mode, int *trivialp) o_allow_pre = o_deny = g_deny = 0; g_allow = e_allow = pubset; + rperm = ACE_READ_DATA; + wperm = ACE_WRITE_DATA | ACE_APPEND_DATA; + eperm = ACE_EXECUTE; + + if ((acl->acl_flags & ACL_IS_DIR) != 0) + wperm |= ACE_DELETE_CHILD; + /* Permissions for everyone@ */ if (mode & 0004) - e_allow |= ACE_READ_DATA; + e_allow |= rperm; if (mode & 0002) - e_allow |= ACE_WRITE_DATA | ACE_APPEND_DATA; + e_allow |= wperm; if (mode & 0001) - e_allow |= ACE_EXECUTE; + e_allow |= eperm; /* Permissions for group@ */ if (mode & 0040) - g_allow |= ACE_READ_DATA; + g_allow |= rperm; else if (mode & 0004) - g_deny |= ACE_READ_DATA; + g_deny |= rperm; if (mode & 0020) - g_allow |= ACE_WRITE_DATA | ACE_APPEND_DATA; + g_allow |= wperm; else if (mode & 0002) - g_deny |= ACE_WRITE_DATA | ACE_APPEND_DATA; + g_deny |= wperm; if (mode & 0010) - g_allow |= ACE_EXECUTE; + g_allow |= eperm; else if (mode & 0001) - g_deny |= ACE_EXECUTE; + g_deny |= eperm; /* Permissions for owner@ */ if (mode & 0400) { - o_allow |= ACE_READ_DATA; + o_allow |= rperm; if (!(mode & 0040) && (mode & 0004)) - o_allow_pre |= ACE_READ_DATA; + o_allow_pre |= rperm; } else if ((mode & 0040) || (mode & 0004)) - o_deny |= ACE_READ_DATA; + o_deny |= rperm; if (mode & 0200) { - o_allow |= ACE_WRITE_DATA | ACE_APPEND_DATA; + o_allow |= wperm; if (!(mode & 0020) && (mode & 0002)) - o_allow_pre |= ACE_WRITE_DATA | ACE_APPEND_DATA; + o_allow_pre |= wperm; } else if ((mode & 0020) || (mode & 0002)) - o_deny |= ACE_WRITE_DATA | ACE_APPEND_DATA; + o_deny |= wperm; if (mode & 0100) { - o_allow |= ACE_EXECUTE; + o_allow |= eperm; if (!(mode & 0010) && (mode & 0001)) - o_allow_pre |= ACE_EXECUTE; + o_allow_pre |= eperm; } else if ((mode & 0010) || (mode & 0001)) - o_deny |= ACE_EXECUTE; + o_deny |= eperm; i = 3;