This is the mail archive of the
cygwin-cvs@cygwin.com
mailing list for the Cygwin project.
[newlib-cygwin] aclsort: Honor calclass argument and allow recalculating ACL mask.
- From: Corinna Vinschen <corinna at sourceware dot org>
- To: cygwin-cvs at sourceware dot org
- Date: 23 Dec 2015 23:48:38 -0000
- Subject: [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;
}