Fix NtAccessCheck so it works with relative SECURITY_DESCRIPTORs

Evan Deaubl wine at warpedview.com
Mon May 30 14:07:19 CDT 2005


ChangeLog:
 * Fix NtAccessCheck so it works with relative SECURITY_DESCRIPTORs

Index: dlls/ntdll/sec.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/sec.c,v
retrieving revision 1.52
diff -u -p -r1.52 sec.c
--- dlls/ntdll/sec.c	24 May 2005 12:32:19 -0000	1.52
+++ dlls/ntdll/sec.c	30 May 2005 18:59:13 -0000
@@ -1208,15 +1208,29 @@ NtAccessCheck(

         /* marshal security descriptor */
         sd.control = RealSD->Control;
-        sd.owner_len = RtlLengthSid( RealSD->Owner );
-        sd.group_len = RtlLengthSid( RealSD->Group );
-        sd.sacl_len = (RealSD->Sacl ? RealSD->Sacl->AclSize : 0);
-        sd.dacl_len = (RealSD->Dacl ? RealSD->Dacl->AclSize : 0);
+
+        PSID owner;
+        BOOLEAN defaulted, present;
+        RtlGetOwnerSecurityDescriptor(RealSD, &owner, &defaulted);
+        sd.owner_len = RtlLengthSid( owner );
+
+        PSID group;
+        RtlGetGroupSecurityDescriptor(RealSD, &group, &defaulted);
+        sd.group_len = RtlLengthSid( group );
+
+        PACL sacl;
+        RtlGetSaclSecurityDescriptor(RealSD, &present, &sacl, &defaulted);
+        sd.sacl_len = (present ? sacl->AclSize : 0);
+
+        PACL dacl;
+        RtlGetDaclSecurityDescriptor(RealSD, &present, &dacl, &defaulted);
+        sd.dacl_len = (present ? dacl->AclSize : 0);
+
         wine_server_add_data( req, &sd, sizeof(sd) );
-        wine_server_add_data( req, RealSD->Owner, sd.owner_len );
-        wine_server_add_data( req, RealSD->Group, sd.group_len );
-        wine_server_add_data( req, RealSD->Sacl, sd.sacl_len );
-        wine_server_add_data( req, RealSD->Dacl, sd.dacl_len );
+        wine_server_add_data( req, owner, sd.owner_len );
+        wine_server_add_data( req, group, sd.group_len );
+        wine_server_add_data( req, sacl, sd.sacl_len );
+        wine_server_add_data( req, dacl, sd.dacl_len );

         wine_server_set_reply( req, &PrivilegeSet->Privilege, *ReturnLength - FIELD_OFFSET( PRIVILEGE_SET, Privilege ) );




More information about the wine-patches mailing list