PATCH: adjust section alignment handling
Marcus Meissner
marcus at jet.franken.de
Sun Nov 9 14:40:15 CST 2003
Hi,
Checks using section alignment are pretty strict, which they don't need to be.
This is exposed when using "unusual" dlls, who have just 128 byte alignment.
Ciao, Marcus
Changelog:
Check section sizes rounded up against the specified section alignment,
not page size.
Index: dlls/ntdll/virtual.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/virtual.c,v
retrieving revision 1.17
diff -u -r1.17 virtual.c
--- dlls/ntdll/virtual.c 4 Nov 2003 04:50:19 -0000 1.17
+++ dlls/ntdll/virtual.c 9 Nov 2003 20:34:43 -0000
@@ -132,6 +132,9 @@
#define ROUND_SIZE(addr,size) \
(((UINT)(size) + ((UINT_PTR)(addr) & page_mask) + page_mask) & ~page_mask)
+#define ROUND_SIZE_MASK(addr,size,mask) \
+ (((UINT)(size) + ((UINT_PTR)(addr) & (mask)) + (mask)) & ~(mask))
+
#define VIRTUAL_DEBUG_DUMP_VIEW(view) \
if (!TRACE_ON(virtual)); else VIRTUAL_DumpView(view)
@@ -621,10 +624,18 @@
for (i = pos = 0; i < nt->FileHeader.NumberOfSections; i++, sec++)
{
- DWORD size;
+ DWORD size, secmask;
+
+ /* Be careful when accessing the optional header */
+ if ((nt->FileHeader.SizeOfOptionalHeader >= 0x24) &&
+ nt->OptionalHeader.SectionAlignment
+ )
+ secmask = nt->OptionalHeader.SectionAlignment-1;
+ else
+ secmask = page_mask;
/* a few sanity checks */
- size = sec->VirtualAddress + ROUND_SIZE( sec->VirtualAddress, sec->Misc.VirtualSize );
+ size = sec->VirtualAddress + ROUND_SIZE_MASK( sec->VirtualAddress, sec->Misc.VirtualSize, secmask );
if (sec->VirtualAddress > total_size || size > total_size || size < sec->VirtualAddress)
{
ERR_(module)( "Section %.8s too large (%lx+%lx/%lx)\n",
@@ -635,8 +646,8 @@
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",
+ size = ROUND_SIZE_MASK( 0, sec->Misc.VirtualSize, secmask );
+ TRACE_(module)( "mapping shared section %.8s at %p off 0x%lx (%x) size 0x%lx (%lx) flags 0x%lx\n",
sec->Name, ptr + sec->VirtualAddress,
sec->PointerToRawData, pos, sec->SizeOfRawData,
size, sec->Characteristics );
@@ -653,7 +664,7 @@
imports->VirtualAddress < sec->VirtualAddress + size)
{
UINT_PTR base = imports->VirtualAddress & ~page_mask;
- UINT_PTR end = base + ROUND_SIZE( imports->VirtualAddress, imports->Size );
+ UINT_PTR end = base + ROUND_SIZE_MASK( imports->VirtualAddress, imports->Size, secmask );
if (end > sec->VirtualAddress + size) end = sec->VirtualAddress + size;
if (end > base) VIRTUAL_mmap( shared_fd, ptr + base, end - base,
pos + (base - sec->VirtualAddress), 0,
@@ -686,7 +697,7 @@
if ((sec->SizeOfRawData < sec->Misc.VirtualSize) && (sec->SizeOfRawData & page_mask))
{
- DWORD end = ROUND_SIZE( 0, sec->SizeOfRawData );
+ DWORD end = ROUND_SIZE_MASK( 0, sec->SizeOfRawData, secmask );
if (end > sec->Misc.VirtualSize) end = sec->Misc.VirtualSize;
TRACE_(module)("clearing %p - %p\n",
ptr + sec->VirtualAddress + sec->SizeOfRawData,
More information about the wine-patches
mailing list