This is the mail archive of the
cygwin-patches@cygwin.com
mailing list for the Cygwin project.
[PATCH] performance patch for /proc/registry -- version 2
- From: Joe Buehler <jbuehler at hekimian dot com>
- To: cygwin-patches at cygwin dot com
- Date: Wed, 26 Mar 2003 09:12:56 -0500
- Subject: [PATCH] performance patch for /proc/registry -- version 2
- Organization: Spirent Communications, Inc.
- Reply-to: jbuehler at hekimian dot com
Here is a second version of the patch, with the code indented
properly -- no other changes. I just ran "indent -nut" on it
after looking around for Cygwin coding standards info.
2003-03-25 Joe Buehler <jhpb at draco dot hekimian dot com>
* autoload.cc: added RegGetKeySecurity()
* security.cc (get_nt_object_attribute): use RegGetKeySecurity() for performance.
Index: autoload.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/autoload.cc,v
retrieving revision 1.65
diff -u -r1.65 autoload.cc
--- autoload.cc 13 Mar 2003 22:53:15 -0000 1.65
+++ autoload.cc 25 Mar 2003 19:28:24 -0000
@@ -375,6 +373,7 @@
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)
Index: security.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/security.cc,v
retrieving revision 1.141
diff -u -r1.141 security.cc
--- security.cc 19 Mar 2003 21:34:38 -0000 1.141
+++ security.cc 26 Mar 2003 14:08:30 -0000
@@ -1443,19 +1444,73 @@
PSECURITY_DESCRIPTOR psd = NULL;
cygpsid owner_sid;
cygpsid group_sid;
- PACL acl;
+ PACL acl = NULL;
- 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))
+ if (object_type == SE_REGISTRY_KEY)
{
- __seterrno ();
- debug_printf ("GetSecurityInfo %E");
- return -1;
+ // 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
+ {
+ 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;
--
Joe Buehler