[PATCH] ntoskrnl.exe: Protect the two relocated pages independently.
Zebediah Figura
z.figura12 at gmail.com
Fri May 22 09:52:56 CDT 2020
They may have different protection flags.
This fixes a regression introduced by 22dfb0df10b44d1c21b3d04b59312670c2318431.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49198
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index e7d343a2ab..3bbb3c4928 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -3362,8 +3362,8 @@ static NTSTATUS perform_relocations( void *module, SIZE_T len, ULONG page_size )
while (rel < end - 1 && rel->SizeOfBlock)
{
- void *page = get_rva( module, rel->VirtualAddress );
- DWORD old_prot;
+ char *page = get_rva( module, rel->VirtualAddress );
+ DWORD old_prot1, old_prot2;
if (rel->VirtualAddress >= len)
{
@@ -3373,10 +3373,12 @@ static NTSTATUS perform_relocations( void *module, SIZE_T len, ULONG page_size )
/* Relocation entries may hang over the end of the page, so we need to
* protect two pages. */
- VirtualProtect( page, page_size * 2, PAGE_READWRITE, &old_prot );
+ VirtualProtect( page, page_size, PAGE_READWRITE, &old_prot1 );
+ VirtualProtect( page + page_size, page_size, PAGE_READWRITE, &old_prot2 );
rel = LdrProcessRelocationBlock( page, (rel->SizeOfBlock - sizeof(*rel)) / sizeof(USHORT),
(USHORT *)(rel + 1), delta );
- VirtualProtect( page, page_size * 2, old_prot, &old_prot );
+ VirtualProtect( page, page_size, old_prot1, &old_prot1 );
+ VirtualProtect( page + page_size, page_size, old_prot2, &old_prot2 );
if (!rel) return STATUS_INVALID_IMAGE_FORMAT;
}
--
2.26.2
More information about the wine-devel
mailing list