* 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.
This commit is contained in:
		| @@ -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) | ||||
|   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) | ||||
|     { | ||||
|       /* 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)) | ||||
|       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; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user