This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] aclsort: Honor calclass argument and allow recalculating ACL mask.


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=ed3c07215c35ea2a3ebd2f830095bd86fc9b9408

commit ed3c07215c35ea2a3ebd2f830095bd86fc9b9408
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Thu Dec 24 00:48:20 2015 +0100

    aclsort: Honor calclass argument and allow recalculating ACL mask.
    
            * sec_acl.cc (__aclcalcmask): New function to recalculate ACL masks.
            (aclsort32): Honor calclass argument.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/ChangeLog  |  5 +++++
 winsup/cygwin/sec_acl.cc | 22 +++++++++++++++++++++-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 930aa79..3bddc68 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,10 @@
 2015-12-24  Corinna Vinschen  <corinna@vinschen.de>
 
+	* sec_acl.cc (__aclcalcmask): New function to recalculate ACL masks.
+	(aclsort32): Honor calclass argument.
+
+2015-12-24  Corinna Vinschen  <corinna@vinschen.de>
+
 	* sec_acl.cc (aclfromtext32): Return missing aclcnt parameter.
 
 2015-12-24  Corinna Vinschen  <corinna@vinschen.de>
diff --git a/winsup/cygwin/sec_acl.cc b/winsup/cygwin/sec_acl.cc
index 614bc50..63257ff 100644
--- a/winsup/cygwin/sec_acl.cc
+++ b/winsup/cygwin/sec_acl.cc
@@ -1295,6 +1295,24 @@ aclcheck32 (aclent_t *aclbufp, int nentries, int *which)
   return 0;
 }
 
+void
+__aclcalcmask (aclent_t *aclbufp, int nentries)
+{
+  acl_perm_t mask = 0;
+  int mask_idx = -1;
+
+  for (int idx = 0; idx < nentries; ++idx)
+    {
+      if (aclbufp[idx].a_type == CLASS_OBJ)
+	mask_idx = idx;
+      else if (aclbufp[idx].a_type
+	       & (USER | GROUP_OBJ | GROUP))
+	mask |= aclbufp[idx].a_perm;
+    }
+  if (mask_idx != -1)
+    aclbufp[mask_idx].a_perm = mask;
+}
+
 static int
 acecmp (const void *a1, const void *a2)
 {
@@ -1307,7 +1325,7 @@ acecmp (const void *a1, const void *a2)
 }
 
 extern "C" int
-aclsort32 (int nentries, int, aclent_t *aclbufp)
+aclsort32 (int nentries, int calclass, aclent_t *aclbufp)
 {
   if (aclcheck32 (aclbufp, nentries, NULL))
     {
@@ -1320,6 +1338,8 @@ aclsort32 (int nentries, int, aclent_t *aclbufp)
       return -1;
     }
   qsort ((void *) aclbufp, nentries, sizeof (aclent_t), acecmp);
+  if (calclass)
+    __aclcalcmask (aclbufp, nentries);
   return 0;
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]