Don't map data beyond the virtual size of a section.
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 43c53b2..9fb0d38 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -931,10 +931,11 @@
goto error;
}
+ size = ROUND_SIZE( 0, sec->Misc.VirtualSize );
+
if ((sec->Characteristics & IMAGE_SCN_MEM_SHARED) &&
(sec->Characteristics & IMAGE_SCN_MEM_WRITE))
{
- size = ROUND_SIZE( 0, sec->Misc.VirtualSize );
TRACE_(module)( "mapping shared section %.8s at %p off %lx (%x) size %lx (%lx) flags %lx\n",
sec->Name, ptr + sec->VirtualAddress,
sec->PointerToRawData, (int)pos, sec->SizeOfRawData,
@@ -964,17 +965,18 @@
continue;
}
- TRACE_(module)( "mapping section %.8s at %p off %lx size %lx flags %lx\n",
+ TRACE_(module)( "mapping section %.8s at %p off %lx size %lx virt %lx flags %lx\n",
sec->Name, ptr + sec->VirtualAddress,
sec->PointerToRawData, sec->SizeOfRawData,
- sec->Characteristics );
+ size, sec->Characteristics );
if (!sec->PointerToRawData || !sec->SizeOfRawData) continue;
+ if (sec->SizeOfRawData < size) size = sec->SizeOfRawData;
/* Note: if the section is not aligned properly map_file_into_view will magically
* fall back to read(), so we don't need to check anything here.
*/
- if (map_file_into_view( view, fd, sec->VirtualAddress, sec->SizeOfRawData, sec->PointerToRawData,
+ if (map_file_into_view( view, fd, sec->VirtualAddress, size, sec->PointerToRawData,
VPROT_COMMITTED | VPROT_READ | VPROT_WRITECOPY,
removable ) != STATUS_SUCCESS)
{