diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2004-04-13 12:14:59 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2004-04-13 12:14:59 +0000 |
commit | 71ffba498c27887a8bf58c01a8d3d1ce82a76792 (patch) | |
tree | f091e8373e7d70907f658f513b7a843c3b9646c9 /winsup/cygwin/security.cc | |
parent | 7e044afdafa7a37c0c065bb819af0acaf1a7bea1 (diff) | |
download | cygnal-71ffba498c27887a8bf58c01a8d3d1ce82a76792.tar.gz cygnal-71ffba498c27887a8bf58c01a8d3d1ce82a76792.tar.bz2 cygnal-71ffba498c27887a8bf58c01a8d3d1ce82a76792.zip |
* autoload.cc (NtQuerySecurityObject): Add.
* ntdll.h (STATUS_BUFFER_TOO_SMALL): Add definition.
(NtQuerySecurityObject): Add declaration.
* security.cc (get_nt_object_attribute): Always use
NtQuerySecurityObject to retrieve security descriptor.
Diffstat (limited to 'winsup/cygwin/security.cc')
-rw-r--r-- | winsup/cygwin/security.cc | 55 |
1 files changed, 23 insertions, 32 deletions
diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc index d9a1e5f85..8420f857b 100644 --- a/winsup/cygwin/security.cc +++ b/winsup/cygwin/security.cc @@ -1374,44 +1374,35 @@ get_nt_object_attribute (HANDLE handle, SE_OBJECT_TYPE object_type, { security_descriptor sd; PSECURITY_DESCRIPTOR psd = NULL; - LONG ret; - - if (object_type == SE_REGISTRY_KEY) - { - /* use different code for registry handles, for performance reasons */ - DWORD len = 0; - if ((ret = RegGetKeySecurity ((HKEY) handle, - DACL_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | OWNER_SECURITY_INFORMATION, - sd, &len)) != ERROR_INSUFFICIENT_BUFFER) - __seterrno_from_win_error (ret); - else if (!sd.malloc (len)) + + NTSTATUS ret; + ULONG len = 0; + ret = NtQuerySecurityObject (handle, + DACL_SECURITY_INFORMATION + | GROUP_SECURITY_INFORMATION + | OWNER_SECURITY_INFORMATION, + sd, len, &len); + if (ret == STATUS_BUFFER_TOO_SMALL) + { + if (!sd.malloc (len)) set_errno (ENOMEM); - else if ((ret = RegGetKeySecurity ((HKEY) handle, - DACL_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | OWNER_SECURITY_INFORMATION, - sd, &len)) != ERROR_SUCCESS) - __seterrno_from_win_error (ret); else - psd = sd; - get_info_from_sd (psd, attribute, uidret, gidret); + ret = NtQuerySecurityObject (handle, + DACL_SECURITY_INFORMATION + | GROUP_SECURITY_INFORMATION + | OWNER_SECURITY_INFORMATION, + sd, len, &len); } - else if ((ret = GetSecurityInfo (handle, object_type, - DACL_SECURITY_INFORMATION - | GROUP_SECURITY_INFORMATION - | OWNER_SECURITY_INFORMATION, - NULL, NULL, NULL, NULL, &psd))) + if (ret != STATUS_SUCCESS) { - __seterrno_from_win_error (ret); - return -1; + __seterrno_from_win_error (RtlNtStatusToDosError (ret)); + if (object_type == SE_FILE_OBJECT) + return -1; } else - { - get_info_from_sd (psd, attribute, uidret, gidret); - LocalFree (psd); - } + psd = sd; + get_info_from_sd (psd, attribute, uidret, gidret); + return 0; } |