OSDN Git Service

* autoload.cc: added RegGetKeySecurity()
authorcorinna <corinna>
Thu, 27 Mar 2003 09:40:25 +0000 (09:40 +0000)
committercorinna <corinna>
Thu, 27 Mar 2003 09:40:25 +0000 (09:40 +0000)
* security.cc (get_nt_object_attribute): use RegGetKeySecurity() for
performance.

winsup/cygwin/ChangeLog
winsup/cygwin/autoload.cc
winsup/cygwin/security.cc

index 5d221cb..5b02bd8 100644 (file)
@@ -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>
 
index 16491e0..59d8469 100644 (file)
@@ -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)
index 0c9e24c..f05fb39 100644 (file)
@@ -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;