mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 17:44:45 +00:00
don't touch memory outside the area to be probed in ProbeForWrite() and minor address range check fixes in ProbeForRead/Write()
svn path=/trunk/; revision=13167
This commit is contained in:
parent
0b7bbeea36
commit
808fec3b76
1 changed files with 15 additions and 12 deletions
|
@ -795,7 +795,7 @@ ProbeForRead (IN CONST VOID *Address,
|
|||
IN ULONG Length,
|
||||
IN ULONG Alignment)
|
||||
{
|
||||
ASSERT(Alignment ==1 || Alignment == 2 || Alignment == 4 || Alignment == 8);
|
||||
ASSERT(Alignment == 1 || Alignment == 2 || Alignment == 4 || Alignment == 8);
|
||||
|
||||
if (Length == 0)
|
||||
return;
|
||||
|
@ -804,8 +804,8 @@ ProbeForRead (IN CONST VOID *Address,
|
|||
{
|
||||
ExRaiseStatus (STATUS_DATATYPE_MISALIGNMENT);
|
||||
}
|
||||
else if ((ULONG_PTR)Address + Length < (ULONG_PTR)Address ||
|
||||
(ULONG_PTR)Address + Length > (ULONG_PTR)MmUserProbeAddress)
|
||||
else if ((ULONG_PTR)Address + Length - 1 < (ULONG_PTR)Address ||
|
||||
(ULONG_PTR)Address + Length - 1 > (ULONG_PTR)MmUserProbeAddress)
|
||||
{
|
||||
ExRaiseStatus (STATUS_ACCESS_VIOLATION);
|
||||
}
|
||||
|
@ -820,10 +820,10 @@ ProbeForWrite (IN CONST VOID *Address,
|
|||
IN ULONG Length,
|
||||
IN ULONG Alignment)
|
||||
{
|
||||
volatile PCHAR Ptr;
|
||||
ULONG i;
|
||||
volatile CHAR *Current;
|
||||
PCHAR Last;
|
||||
|
||||
ASSERT(Alignment ==1 || Alignment == 2 || Alignment == 4 || Alignment == 8);
|
||||
ASSERT(Alignment == 1 || Alignment == 2 || Alignment == 4 || Alignment == 8);
|
||||
|
||||
if (Length == 0)
|
||||
return;
|
||||
|
@ -832,18 +832,21 @@ ProbeForWrite (IN CONST VOID *Address,
|
|||
{
|
||||
ExRaiseStatus (STATUS_DATATYPE_MISALIGNMENT);
|
||||
}
|
||||
else if ((ULONG_PTR)Address + Length < (ULONG_PTR)Address ||
|
||||
(ULONG_PTR)Address + Length > (ULONG_PTR)MmUserProbeAddress)
|
||||
|
||||
Last = (PCHAR)((ULONG_PTR)Address + Length - 1);
|
||||
if ((ULONG_PTR)Last < (ULONG_PTR)Address ||
|
||||
(ULONG_PTR)Last > (ULONG_PTR)MmUserProbeAddress)
|
||||
{
|
||||
ExRaiseStatus (STATUS_ACCESS_VIOLATION);
|
||||
}
|
||||
|
||||
/* Check for accessible pages */
|
||||
for (i = 0; i < Length; i += PAGE_SIZE)
|
||||
Current = (CHAR*)Address;
|
||||
do
|
||||
{
|
||||
Ptr = (PCHAR)(((ULONG_PTR)Address & ~(PAGE_SIZE - 1)) + i);
|
||||
*Ptr = *Ptr;
|
||||
}
|
||||
*Current = *Current;
|
||||
Current = (CHAR*)((ULONG_PTR)Current + PAGE_SIZE);
|
||||
} while (Current <= Last);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
Loading…
Reference in a new issue