From: corinna Date: Mon, 8 Aug 2005 16:30:15 +0000 (+0000) Subject: * security.cc (get_reg_security): New static function. X-Git-Tag: pre_wait_sig_exit~399 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=61e443d51ee961e2ed3e83f82fb808e073fefc58;p=pf3gnuchains%2Fpf3gnuchains4x.git * security.cc (get_reg_security): New static function. (get_nt_object_security): Call get_reg_security for registry keys to circumvent problems with predefined registry keys. --- diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 8db3f4e44d..04945b7e65 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,11 @@ 2005-08-08 Corinna Vinschen + * security.cc (get_reg_security): New static function. + (get_nt_object_security): Call get_reg_security for registry keys + to circumvent problems with predefined registry keys. + +2005-08-08 Corinna Vinschen + * fhandler_process.cc (fhandler_process::open): Allow opening of /proc//fd for reading. * fhandler_registry.cc (fhandler_registry::open): Ditto for registry diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc index fce6eb074d..870bb69369 100644 --- a/winsup/cygwin/security.cc +++ b/winsup/cygwin/security.cc @@ -1340,12 +1340,52 @@ get_nt_attribute (const char *file, mode_t *attribute, get_info_from_sd (sd, attribute, uidret, gidret); } +static int +get_reg_security (HANDLE handle, security_descriptor &sd_ret) +{ + LONG ret; + DWORD len = 0; + + ret = RegGetKeySecurity ((HKEY) handle, + DACL_SECURITY_INFORMATION + | GROUP_SECURITY_INFORMATION + | OWNER_SECURITY_INFORMATION, + sd_ret, &len); + if (ret == ERROR_INSUFFICIENT_BUFFER) + { + if (!sd_ret.malloc (len)) + set_errno (ENOMEM); + else + ret = RegGetKeySecurity ((HKEY) handle, + DACL_SECURITY_INFORMATION + | GROUP_SECURITY_INFORMATION + | OWNER_SECURITY_INFORMATION, + sd_ret, &len); + } + if (ret != STATUS_SUCCESS) + { + __seterrno (); + return -1; + } + return 0; +} + int get_nt_object_security (HANDLE handle, SE_OBJECT_TYPE object_type, security_descriptor &sd_ret) { NTSTATUS ret; ULONG len = 0; + + /* Unfortunately, NtQuerySecurityObject doesn't work on predefined registry + keys like HKEY_LOCAL_MACHINE. It fails with "Invalid Handle". So we + have to retreat to the Win32 registry functions for registry keys. + What bugs me is that RegGetKeySecurity is obviously just a wrapper + around NtQuerySecurityObject, but there seems to be no function to + convert pseudo HKEY values to real handles. */ + if (object_type == SE_REGISTRY_KEY) + return get_reg_security (handle, sd_ret); + ret = NtQuerySecurityObject (handle, DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION