Module: wine Branch: master Commit: 4d417076e4378efb613f8519fdc57119fb1df635 URL: https://gitlab.winehq.org/wine/wine/-/commit/4d417076e4378efb613f8519fdc5711...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Sep 25 11:01:29 2023 +0200
server: Don't zero out the PE optional header regardless of specified size.
---
dlls/kernel32/tests/loader.c | 17 ++++++++--------- server/mapping.c | 27 ++++++++++++++------------- 2 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c index e360c24ee63..0d611990fd4 100644 --- a/dlls/kernel32/tests/loader.c +++ b/dlls/kernel32/tests/loader.c @@ -144,13 +144,13 @@ static const IMAGE_NT_HEADERS nt_header_template = sizeof(dos_header) + sizeof(nt_header_template), /* SizeOfHeaders */ 0, /* CheckSum */ IMAGE_SUBSYSTEM_WINDOWS_CUI, /* Subsystem */ - 0, /* DllCharacteristics */ - 0, /* SizeOfStackReserve */ - 0, /* SizeOfStackCommit */ - 0, /* SizeOfHeapReserve */ - 0, /* SizeOfHeapCommit */ + IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE | IMAGE_DLLCHARACTERISTICS_NX_COMPAT, /* DllCharacteristics */ + 0x100000, /* SizeOfStackReserve */ + 0x1000, /* SizeOfStackCommit */ + 0x100000, /* SizeOfHeapReserve */ + 0x1000, /* SizeOfHeapCommit */ 0, /* LoaderFlags */ - 0, /* NumberOfRvaAndSizes */ + IMAGE_NUMBEROF_DIRECTORY_ENTRIES, /* NumberOfRvaAndSizes */ { { 0 } } /* DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] */ } }; @@ -401,7 +401,6 @@ static BOOL query_image_section( int id, const char *dll_name, const IMAGE_NT_HE "%u: MaximumStackSize wrong %Ix / %Ix\n", id, image.MaximumStackSize, max_stack ); ok( image.CommittedStackSize == commit_stack, "%u: CommittedStackSize wrong %Ix / %Ix\n", id, image.CommittedStackSize, commit_stack ); - todo_wine_if( truncated ) ok( image.SubSystemType == nt_header->OptionalHeader.Subsystem, "%u: SubSystemType wrong %08lx / %08x\n", id, image.SubSystemType, nt_header->OptionalHeader.Subsystem ); @@ -481,7 +480,7 @@ static BOOL query_image_section( int id, const char *dll_name, const IMAGE_NT_HE if (!(nt_header->OptionalHeader.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE)) ok( !image.ImageDynamicallyRelocated || broken( image.ComPlusILOnly ), /* <= win7 */ "%u: wrong ImageDynamicallyRelocated flags %02x\n", id, image.ImageFlags ); - else if (image.ImageContainsCode && !cor_header) + else if (image.ImageContainsCode && !image.ImageMappedFlat && !cor_header) ok( image.ImageDynamicallyRelocated, "%u: wrong ImageDynamicallyRelocated flags %02x\n", id, image.ImageFlags ); else @@ -866,7 +865,7 @@ static void test_Loader(void) { 0x04, 0, 0x08, 0x04 /* also serves as e_lfanew in the truncated MZ header */, 0x04, - 0x200000, + 0x2000, 0x40, { ERROR_SUCCESS } } diff --git a/server/mapping.c b/server/mapping.c index 5d4df2050e4..0a69261c0ee 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -695,8 +695,8 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s } opt; } nt; off_t pos; - int size, opt_size; - size_t mz_size, clr_va, clr_size; + int size; + size_t mz_size, clr_va = 0, clr_size = 0; unsigned int i;
/* load the headers */ @@ -710,9 +710,6 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
size = pread( unix_fd, &nt, sizeof(nt), pos ); if (size < sizeof(nt.Signature) + sizeof(nt.FileHeader)) return STATUS_INVALID_IMAGE_PROTECT; - /* zero out Optional header in the case it's not present or partial */ - opt_size = max( nt.FileHeader.SizeOfOptionalHeader, offsetof( IMAGE_OPTIONAL_HEADER32, CheckSum )); - size = min( size, sizeof(nt.Signature) + sizeof(nt.FileHeader) + opt_size ); if (size < sizeof(nt)) memset( (char *)&nt + size, 0, sizeof(nt) - size ); if (nt.Signature != IMAGE_NT_SIGNATURE) { @@ -729,9 +726,11 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s if (!is_machine_32bit( nt.FileHeader.Machine )) return STATUS_INVALID_IMAGE_FORMAT; if (!is_machine_supported( nt.FileHeader.Machine )) return STATUS_INVALID_IMAGE_FORMAT;
- clr_va = nt.opt.hdr32.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress; - clr_size = nt.opt.hdr32.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].Size; - + if (nt.opt.hdr32.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR) + { + clr_va = nt.opt.hdr32.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress; + clr_size = nt.opt.hdr32.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].Size; + } mapping->image.base = nt.opt.hdr32.ImageBase; mapping->image.entry_point = nt.opt.hdr32.AddressOfEntryPoint; mapping->image.map_size = ROUND_SIZE( nt.opt.hdr32.SizeOfImage ); @@ -751,7 +750,7 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s mapping->image.image_flags = 0; if (nt.opt.hdr32.SectionAlignment & page_mask) mapping->image.image_flags |= IMAGE_FLAGS_ImageMappedFlat; - if ((nt.opt.hdr32.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) && + else if ((nt.opt.hdr32.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) && mapping->image.contains_code && !(clr_va && clr_size)) mapping->image.image_flags |= IMAGE_FLAGS_ImageDynamicallyRelocated; break; @@ -761,9 +760,11 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s if (!is_machine_64bit( nt.FileHeader.Machine )) return STATUS_INVALID_IMAGE_FORMAT; if (!is_machine_supported( nt.FileHeader.Machine )) return STATUS_INVALID_IMAGE_FORMAT;
- clr_va = nt.opt.hdr64.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress; - clr_size = nt.opt.hdr64.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].Size; - + if (nt.opt.hdr64.NumberOfRvaAndSizes > IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR) + { + clr_va = nt.opt.hdr64.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress; + clr_size = nt.opt.hdr64.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].Size; + } mapping->image.base = nt.opt.hdr64.ImageBase; mapping->image.entry_point = nt.opt.hdr64.AddressOfEntryPoint; mapping->image.map_size = ROUND_SIZE( nt.opt.hdr64.SizeOfImage ); @@ -783,7 +784,7 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s mapping->image.image_flags = 0; if (nt.opt.hdr64.SectionAlignment & page_mask) mapping->image.image_flags |= IMAGE_FLAGS_ImageMappedFlat; - if ((nt.opt.hdr64.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) && + else if ((nt.opt.hdr64.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) && mapping->image.contains_code && !(clr_va && clr_size)) mapping->image.image_flags |= IMAGE_FLAGS_ImageDynamicallyRelocated; break;