From 84b3218ed6ad5975f537481edf2f61fb26bedb8b Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Mon, 8 Aug 2016 16:20:50 +0200 Subject: [PATCH] server: Fix loading of IMAGE_OPTIONAL_HEADER. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/loader.c | 10 +++++++--- server/mapping.c | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c index 6ee9e38aa0a..7585b9b00f8 100644 --- a/dlls/kernel32/tests/loader.c +++ b/dlls/kernel32/tests/loader.c @@ -264,9 +264,13 @@ static void query_image_section( int id, const char *dll_name, const IMAGE_NT_HE ok( image.CommittedStackSize == nt_header->OptionalHeader.SizeOfStackCommit || broken(truncated), "%u: CommittedStackSize wrong %lx / %lx\n", id, image.CommittedStackSize, (SIZE_T)nt_header->OptionalHeader.SizeOfStackCommit ); - ok( image.SubSystemType == nt_header->OptionalHeader.Subsystem || broken(truncated), - "%u: SubSystemType wrong %08x / %08x\n", id, - image.SubSystemType, nt_header->OptionalHeader.Subsystem ); + if (truncated) + ok( !image.SubSystemType || broken(truncated), + "%u: SubSystemType wrong %08x / 00000000\n", id, image.SubSystemType ); + else + ok( image.SubSystemType == nt_header->OptionalHeader.Subsystem, + "%u: SubSystemType wrong %08x / %08x\n", id, + image.SubSystemType, nt_header->OptionalHeader.Subsystem ); ok( image.SubsystemVersionLow == nt_header->OptionalHeader.MinorSubsystemVersion, "%u: SubsystemVersionLow wrong %04x / %04x\n", id, image.SubsystemVersionLow, nt_header->OptionalHeader.MinorSubsystemVersion ); diff --git a/server/mapping.c b/server/mapping.c index b68f2817f6b..f82907ba983 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -399,7 +399,7 @@ 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_FORMAT; /* zero out Optional header in the case it's not present or partial */ - size = min( size, nt.FileHeader.SizeOfOptionalHeader ); + size = min( size, sizeof(nt.Signature) + sizeof(nt.FileHeader) + nt.FileHeader.SizeOfOptionalHeader ); if (size < sizeof(nt)) memset( (char *)&nt + size, 0, sizeof(nt) - size ); if (nt.Signature != IMAGE_NT_SIGNATURE) {