SeCaptureSecurityDescriptor() should only copy SIDs and ACLs when
present
Modified: trunk/reactos/ntoskrnl/se/sd.c
_____
Modified: trunk/reactos/ntoskrnl/se/sd.c
--- trunk/reactos/ntoskrnl/se/sd.c 2005-01-21 02:34:33 UTC (rev
13177)
+++ trunk/reactos/ntoskrnl/se/sd.c 2005-01-21 02:39:59 UTC (rev
13178)
@@ -127,7 +127,7 @@
ULONG OwnerSAC = 0, GroupSAC = 0;
ULONG OwnerSize = 0, GroupSize = 0;
ULONG SaclSize = 0, DaclSize = 0;
- ULONG DescriptorSize;
+ ULONG DescriptorSize = sizeof(SECURITY_DESCRIPTOR);
NTSTATUS Status = STATUS_SUCCESS;
if(OriginalSecurityDescriptor != NULL)
@@ -212,6 +212,7 @@
1);
\
SidType##SAC = SidType->SubAuthorityCount;
\
SidType##Size = RtlLengthRequiredSid(SidType##SAC);
\
+ DescriptorSize += ROUND_UP(SidType##Size, sizeof(ULONG));
\
ProbeForRead(SidType,
\
SidType##Size,
\
sizeof(ULONG));
\
@@ -235,6 +236,7 @@
{
\
SidType##SAC = SidType->SubAuthorityCount;
\
SidType##Size = RtlLengthRequiredSid(SidType##SAC);
\
+ DescriptorSize += ROUND_UP(SidType##Size, sizeof(ULONG));
\
}
\
}
\
} while(0)
@@ -259,6 +261,7 @@
sizeof(AclType->AclSize),
\
1);
\
AclType##Size = AclType->AclSize;
\
+ DescriptorSize += ROUND_UP(AclType##Size, sizeof(ULONG));
\
ProbeForRead(AclType,
\
AclType##Size,
\
sizeof(ULONG));
\
@@ -281,6 +284,7 @@
else
\
{
\
AclType##Size = AclType->AclSize;
\
+ DescriptorSize += ROUND_UP(AclType##Size, sizeof(ULONG));
\
}
\
}
\
else
\
@@ -294,12 +298,6 @@
/* allocate enough memory to store a complete copy of a
self-relative
security descriptor */
- DescriptorSize = sizeof(SECURITY_DESCRIPTOR) +
- ROUND_UP(OwnerSize, sizeof(ULONG)) +
- ROUND_UP(GroupSize, sizeof(ULONG)) +
- ROUND_UP(SaclSize, sizeof(ULONG)) +
- ROUND_UP(DaclSize, sizeof(ULONG));
-
NewDescriptor = ExAllocatePool(PoolType,
DescriptorSize);
if(NewDescriptor != NULL)
@@ -310,30 +308,28 @@
NewDescriptor->Sbz1 = DescriptorCopy.Sbz1;
NewDescriptor->Control = DescriptorCopy.Control |
SE_SELF_RELATIVE;
- /* setup the offsets to the SIDs and ACLs */
- NewDescriptor->Owner = (PVOID)Offset;
- Offset += ROUND_UP(OwnerSize, sizeof(ULONG));
- NewDescriptor->Group = (PVOID)Offset;
- Offset += ROUND_UP(GroupSize, sizeof(ULONG));
- NewDescriptor->Sacl = (PVOID)Offset;
- Offset += ROUND_UP(SaclSize, sizeof(ULONG));
- NewDescriptor->Dacl = (PVOID)Offset;
-
_SEH_TRY
{
- /* copy the SIDs and ACLs to the new self-relative security
descriptor */
- RtlCopyMemory((PVOID)((ULONG_PTR)NewDescriptor +
(ULONG_PTR)NewDescriptor->Owner),
- DescriptorCopy.Owner,
- OwnerSize);
- RtlCopyMemory((PVOID)((ULONG_PTR)NewDescriptor +
(ULONG_PTR)NewDescriptor->Group),
- DescriptorCopy.Group,
- GroupSize);
- RtlCopyMemory((PVOID)((ULONG_PTR)NewDescriptor +
(ULONG_PTR)NewDescriptor->Sacl),
- DescriptorCopy.Sacl,
- SaclSize);
- RtlCopyMemory((PVOID)((ULONG_PTR)NewDescriptor +
(ULONG_PTR)NewDescriptor->Dacl),
- DescriptorCopy.Dacl,
- DaclSize);
+ /* setup the offsets and copy the SIDs and ACLs to the new
+ self-relative security descriptor. Probing the pointers is
not
+ neccessary anymore as we did that when collecting the sizes!
*/
+#define CopySIDOrACL(Type)
\
+ do {
\
+ if(DescriptorCopy.Type != NULL)
\
+ {
\
+ NewDescriptor->Type = (PVOID)Offset;
\
+ RtlCopyMemory((PVOID)((ULONG_PTR)NewDescriptor +
\
+ (ULONG_PTR)NewDescriptor->Type),
\
+ DescriptorCopy.Type,
\
+ Type##Size);
\
+ Offset += ROUND_UP(Type##Size, sizeof(ULONG));
\
+ }
\
+ } while(0)
+
+ CopySIDOrACL(Owner);
+ CopySIDOrACL(Group);
+ CopySIDOrACL(Sacl);
+ CopySIDOrACL(Dacl);
}
_SEH_HANDLE
{