[PATCH] performance patch for /proc/registry -- version 2

Chris January chris@atomice.net
Wed Mar 26 19:42:00 GMT 2003


How common are ACLs > 4096 bytes? Could you try calling RegKeyGetSecurity
twice? First with a length of 0. Then RegKeyGetSecurity will set length to
the required buffer size which you can allocate dynamically using new.

Chris

> 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@draco.hekimian.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



More information about the Cygwin-patches mailing list