From: Bruno Haible Date: Sun, 19 Feb 2012 20:59:07 +0000 (+0100) Subject: acl: Fix copy-acl test failure on Solaris 11 2011-11. X-Git-Tag: v0.1~1146 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=ec10a26aea109e60b185b026a84d68d4ebb50952;p=gnulib.git acl: Fix copy-acl test failure on Solaris 11 2011-11. * lib/file-has-acl.c (NEW_ACE_WRITEA_DATA): New macro. (acl_ace_nontrivial): Relax the restrictions on access_masks[] so that this function returns 0 in some more cases. --- diff --git a/ChangeLog b/ChangeLog index 9842d6f5f..82726fb14 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2012-02-19 Bruno Haible + acl: Fix copy-acl test failure on Solaris 11 2011-11. + * lib/file-has-acl.c (NEW_ACE_WRITEA_DATA): New macro. + (acl_ace_nontrivial): Relax the restrictions on access_masks[] so + that this function returns 0 in some more cases. + +2012-02-19 Bruno Haible + acl: Update doc references. * doc/acl-resources.txt: Update links to Solaris documentation. diff --git a/lib/file-has-acl.c b/lib/file-has-acl.c index 89a63a658..2d4531b74 100644 --- a/lib/file-has-acl.c +++ b/lib/file-has-acl.c @@ -154,6 +154,9 @@ acl_nontrivial (int count, aclent_t *entries) # ifdef ACE_GETACL +/* A shortcut for a bitmask. */ +# define NEW_ACE_WRITEA_DATA (NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA) + /* Test an ACL retrieved with ACE_GETACL. Return 1 if the given ACL, consisting of COUNT entries, is non-trivial. Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ @@ -250,16 +253,6 @@ acl_ace_nontrivial (int count, ace_t *entries) | NEW_ACE_WRITE_ATTRIBUTES | NEW_ACE_WRITE_ACL | NEW_ACE_WRITE_OWNER); - if ((NEW_ACE_WRITE_NAMED_ATTRS - | NEW_ACE_WRITE_ATTRIBUTES - | NEW_ACE_WRITE_ACL - | NEW_ACE_WRITE_OWNER) - & ~ access_masks[4]) - return 1; - access_masks[4] &= ~(NEW_ACE_WRITE_NAMED_ATTRS - | NEW_ACE_WRITE_ATTRIBUTES - | NEW_ACE_WRITE_ACL - | NEW_ACE_WRITE_OWNER); if ((NEW_ACE_READ_NAMED_ATTRS | NEW_ACE_READ_ATTRIBUTES | NEW_ACE_READ_ACL @@ -272,21 +265,60 @@ acl_ace_nontrivial (int count, ace_t *entries) | NEW_ACE_SYNCHRONIZE); /* Check the allowed or denied bits. */ - if ((access_masks[0] | access_masks[1]) - != (NEW_ACE_READ_DATA - | NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA - | NEW_ACE_EXECUTE)) - return 1; - if ((access_masks[2] | access_masks[3]) - != (NEW_ACE_READ_DATA - | NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA - | NEW_ACE_EXECUTE)) - return 1; - if ((access_masks[4] | access_masks[5]) - != (NEW_ACE_READ_DATA - | NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA - | NEW_ACE_EXECUTE)) - return 1; + switch ((access_masks[0] | access_masks[1]) + & ~(NEW_ACE_READ_NAMED_ATTRS + | NEW_ACE_READ_ATTRIBUTES + | NEW_ACE_READ_ACL + | NEW_ACE_SYNCHRONIZE)) + { + case 0: + case NEW_ACE_READ_DATA: + case NEW_ACE_WRITEA_DATA: + case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA: + case NEW_ACE_EXECUTE: + case NEW_ACE_READ_DATA | NEW_ACE_EXECUTE: + case NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE: + case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE: + break; + default: + return 1; + } + switch ((access_masks[2] | access_masks[3]) + & ~(NEW_ACE_READ_NAMED_ATTRS + | NEW_ACE_READ_ATTRIBUTES + | NEW_ACE_READ_ACL + | NEW_ACE_SYNCHRONIZE)) + { + case 0: + case NEW_ACE_READ_DATA: + case NEW_ACE_WRITEA_DATA: + case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA: + case NEW_ACE_EXECUTE: + case NEW_ACE_READ_DATA | NEW_ACE_EXECUTE: + case NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE: + case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE: + break; + default: + return 1; + } + switch ((access_masks[4] | access_masks[5]) + & ~(NEW_ACE_WRITE_NAMED_ATTRS + | NEW_ACE_WRITE_ATTRIBUTES + | NEW_ACE_WRITE_ACL + | NEW_ACE_WRITE_OWNER)) + { + case 0: + case NEW_ACE_READ_DATA: + case NEW_ACE_WRITEA_DATA: + case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA: + case NEW_ACE_EXECUTE: + case NEW_ACE_READ_DATA | NEW_ACE_EXECUTE: + case NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE: + case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE: + break; + default: + return 1; + } /* Check that the NEW_ACE_WRITE_DATA and NEW_ACE_APPEND_DATA bits are either both allowed or both denied. */