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