Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2003-03-27 12:40:25 +0300
committerCorinna Vinschen <corinna@vinschen.de>2003-03-27 12:40:25 +0300
commit98b36ec8eded5c0aa1a179b12e9ee69d0ec0fdda (patch)
tree9d4f530508c81f3c98b2a6e240143ee162ce1799 /winsup
parent2f4be7367ec358897546ec8b5972163b5d7cb816 (diff)
* autoload.cc: added RegGetKeySecurity()
* security.cc (get_nt_object_attribute): use RegGetKeySecurity() for performance.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/autoload.cc1
-rw-r--r--winsup/cygwin/security.cc78
3 files changed, 73 insertions, 12 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 5d221cb7f..5b02bd83d 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2003-03-27 Joe Buehler <jhpb@draco.hekimian.com>
+
+ * autoload.cc: added RegGetKeySecurity()
+ * security.cc (get_nt_object_attribute): use RegGetKeySecurity() for
+ performance.
+
2003-03-25 Christopher Faylor <cgf@redhat.com>
Joe Buehler <jhpb@draco.hekimian.com>
diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index 16491e0fe..59d846992 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -375,6 +375,7 @@ LoadDLLfunc (SetSecurityDescriptorDacl, 16, advapi32)
LoadDLLfunc (SetSecurityDescriptorGroup, 12, advapi32)
LoadDLLfunc (SetSecurityDescriptorOwner, 12, advapi32)
LoadDLLfunc (SetTokenInformation, 16, advapi32)
+LoadDLLfunc (RegGetKeySecurity, 16, advapi32)
LoadDLLfunc (NetApiBufferFree, 4, netapi32)
LoadDLLfuncEx (NetGetDCName, 12, netapi32, 1)
diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc
index 0c9e24cb5..f05fb39ef 100644
--- a/winsup/cygwin/security.cc
+++ b/winsup/cygwin/security.cc
@@ -1443,19 +1443,73 @@ get_nt_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type,
PSECURITY_DESCRIPTOR psd = NULL;
cygpsid owner_sid;
cygpsid group_sid;
- PACL acl;
-
- if (ERROR_SUCCESS != GetSecurityInfo (handle, object_type,
- DACL_SECURITY_INFORMATION |
- GROUP_SECURITY_INFORMATION |
- OWNER_SECURITY_INFORMATION,
- (PSID *) &owner_sid,
- (PSID *) &group_sid,
- &acl, NULL, &psd))
+ PACL acl = NULL;
+
+ if (object_type == SE_REGISTRY_KEY)
+ {
+ // use different code for registry handles, for performance reasons
+ char sd_buf[4096];
+ PSECURITY_DESCRIPTOR psd2 = (PSECURITY_DESCRIPTOR) & sd_buf[0];
+ DWORD len = sizeof (sd_buf);
+ if (ERROR_SUCCESS != RegGetKeySecurity ((HKEY) handle,
+ DACL_SECURITY_INFORMATION |
+ GROUP_SECURITY_INFORMATION |
+ OWNER_SECURITY_INFORMATION,
+ psd2, &len))
+ {
+ __seterrno ();
+ debug_printf ("RegGetKeySecurity %E");
+ return -1;
+ }
+
+ BOOL bDaclPresent;
+ BOOL bDaclDefaulted;
+ if (!GetSecurityDescriptorDacl (psd2,
+ &bDaclPresent, &acl, &bDaclDefaulted))
+ {
+ __seterrno ();
+ debug_printf ("GetSecurityDescriptorDacl %E");
+ return -1;
+ }
+ if (!bDaclPresent)
+ {
+ acl = NULL;
+ }
+
+ BOOL bGroupDefaulted;
+ if (!GetSecurityDescriptorGroup (psd2,
+ (PSID *) & group_sid,
+ &bGroupDefaulted))
+ {
+ __seterrno ();
+ debug_printf ("GetSecurityDescriptorGroup %E");
+ return -1;
+ }
+
+ BOOL bOwnerDefaulted;
+ if (!GetSecurityDescriptorOwner (psd2,
+ (PSID *) & owner_sid,
+ &bOwnerDefaulted))
+ {
+ __seterrno ();
+ debug_printf ("GetSecurityDescriptorOwner %E");
+ return -1;
+ }
+ }
+ else
{
- __seterrno ();
- debug_printf ("GetSecurityInfo %E");
- return -1;
+ if (ERROR_SUCCESS != GetSecurityInfo (handle, object_type,
+ DACL_SECURITY_INFORMATION |
+ GROUP_SECURITY_INFORMATION |
+ OWNER_SECURITY_INFORMATION,
+ (PSID *) & owner_sid,
+ (PSID *) & group_sid,
+ &acl, NULL, &psd))
+ {
+ __seterrno ();
+ debug_printf ("GetSecurityInfo %E");
+ return -1;
+ }
}
__uid32_t uid;