summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/security.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2004-04-13 12:14:59 +0000
committerCorinna Vinschen <corinna@vinschen.de>2004-04-13 12:14:59 +0000
commit71ffba498c27887a8bf58c01a8d3d1ce82a76792 (patch)
treef091e8373e7d70907f658f513b7a843c3b9646c9 /winsup/cygwin/security.cc
parent7e044afdafa7a37c0c065bb819af0acaf1a7bea1 (diff)
downloadcygnal-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.cc55
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;
}