RtlCaptureUnicodeString should also check the buffers that the
UNICODE_STRING structure points to...
Modified: trunk/reactos/ntoskrnl/rtl/capture.c
_____
Modified: trunk/reactos/ntoskrnl/rtl/capture.c
--- trunk/reactos/ntoskrnl/rtl/capture.c 2005-01-22 18:08:28 UTC
(rev 13218)
+++ trunk/reactos/ntoskrnl/rtl/capture.c 2005-01-22 20:53:14 UTC
(rev 13219)
@@ -58,6 +58,12 @@
sizeof(UNICODE_STRING),
sizeof(ULONG));
Src = *UnsafeSrc;
+ if(Src.Length > 0)
+ {
+ ProbeForRead(Src.Buffer,
+ Src.Length,
+ sizeof(WCHAR));
+ }
}
_SEH_HANDLE
{
@@ -86,20 +92,19 @@
* Initialize the destination string.
*/
Dest->Length = Src.Length;
- Dest->MaximumLength = Src.Length + sizeof(WCHAR);
- Dest->Buffer = ExAllocatePool(PoolType, Dest->MaximumLength);
- if (Dest->Buffer == NULL)
- {
- Dest->Length = Dest->MaximumLength = 0;
- Dest->Buffer = NULL;
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- /*
- * Copy the source string to kernel space.
- */
if(Src.Length > 0)
{
+ Dest->MaximumLength = Src.Length + sizeof(WCHAR);
+ Dest->Buffer = ExAllocatePool(PoolType, Dest->MaximumLength);
+ if (Dest->Buffer == NULL)
+ {
+ Dest->Length = Dest->MaximumLength = 0;
+ Dest->Buffer = NULL;
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ /*
+ * Copy the source string to kernel space.
+ */
_SEH_TRY
{
RtlCopyMemory(Dest->Buffer, Src.Buffer, Src.Length);
@@ -111,6 +116,11 @@
}
_SEH_END;
}
+ else
+ {
+ Dest->MaximumLength = 0;
+ Dest->Buffer = NULL;
+ }
return Status;
}