Module: wine Branch: master Commit: af25f29cd2406e524b0c5f4aecddfc095de34d2e URL: https://gitlab.winehq.org/wine/wine/-/commit/af25f29cd2406e524b0c5f4aecddfc0...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Sep 25 11:37:31 2023 +0200
winedump: Don't zero out the PE optional header regardless of specified size.
---
tools/winedump/lib.c | 2 +- tools/winedump/pe.c | 17 ++++++++--------- tools/winedump/winedump.h | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/tools/winedump/lib.c b/tools/winedump/lib.c index e2d25b04d24..0b94adb9b33 100644 --- a/tools/winedump/lib.c +++ b/tools/winedump/lib.c @@ -264,7 +264,7 @@ void lib_dump(void) if (fh->SizeOfOptionalHeader) { const IMAGE_OPTIONAL_HEADER32 *oh = (const IMAGE_OPTIONAL_HEADER32 *)((const char *)fh + sizeof(*fh)); - dump_optional_header(oh, fh->SizeOfOptionalHeader); + dump_optional_header(oh); } } /* Sanity check */ diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c index fbcd9f5c6a5..f361e1d86bd 100644 --- a/tools/winedump/pe.c +++ b/tools/winedump/pe.c @@ -275,14 +275,14 @@ static inline void print_datadirectory(DWORD n, const IMAGE_DATA_DIRECTORY *dire } }
-static void dump_optional_header32(const IMAGE_OPTIONAL_HEADER32 *image_oh, UINT header_size) +static void dump_optional_header32(const IMAGE_OPTIONAL_HEADER32 *image_oh) { IMAGE_OPTIONAL_HEADER32 oh; const IMAGE_OPTIONAL_HEADER32 *optionalHeader;
/* in case optional header is missing or partial */ memset(&oh, 0, sizeof(oh)); - memcpy(&oh, image_oh, min(header_size, sizeof(oh))); + memcpy(&oh, image_oh, min(dump_total_len - ((char *)image_oh - (char *)dump_base), sizeof(oh))); optionalHeader = &oh;
print_word("Magic", optionalHeader->Magic); @@ -320,14 +320,14 @@ static void dump_optional_header32(const IMAGE_OPTIONAL_HEADER32 *image_oh, UINT printf("\n"); }
-static void dump_optional_header64(const IMAGE_OPTIONAL_HEADER64 *image_oh, UINT header_size) +static void dump_optional_header64(const IMAGE_OPTIONAL_HEADER64 *image_oh) { IMAGE_OPTIONAL_HEADER64 oh; const IMAGE_OPTIONAL_HEADER64 *optionalHeader;
/* in case optional header is missing or partial */ memset(&oh, 0, sizeof(oh)); - memcpy(&oh, image_oh, min(header_size, sizeof(oh))); + memcpy(&oh, image_oh, min(dump_total_len - ((char *)image_oh - (char *)dump_base), sizeof(oh))); optionalHeader = &oh;
print_word("Magic", optionalHeader->Magic); @@ -364,16 +364,16 @@ static void dump_optional_header64(const IMAGE_OPTIONAL_HEADER64 *image_oh, UINT printf("\n"); }
-void dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *optionalHeader, UINT header_size) +void dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *optionalHeader) { printf("Optional Header (%s)\n", get_magic_type(optionalHeader->Magic));
switch(optionalHeader->Magic) { case IMAGE_NT_OPTIONAL_HDR32_MAGIC: - dump_optional_header32(optionalHeader, header_size); + dump_optional_header32(optionalHeader); break; case IMAGE_NT_OPTIONAL_HDR64_MAGIC: - dump_optional_header64((const IMAGE_OPTIONAL_HEADER64 *)optionalHeader, header_size); + dump_optional_header64((const IMAGE_OPTIONAL_HEADER64 *)optionalHeader); break; default: printf(" Unknown optional header magic: 0x%-4X\n", optionalHeader->Magic); @@ -428,8 +428,7 @@ void dump_file_header(const IMAGE_FILE_HEADER *fileHeader, BOOL is_hybrid) static void dump_pe_header(void) { dump_file_header(&PE_nt_headers->FileHeader, get_hybrid_metadata() != NULL); - dump_optional_header((const IMAGE_OPTIONAL_HEADER32*)&PE_nt_headers->OptionalHeader, - PE_nt_headers->FileHeader.SizeOfOptionalHeader); + dump_optional_header((const IMAGE_OPTIONAL_HEADER32*)&PE_nt_headers->OptionalHeader); }
void dump_section_characteristics(DWORD characteristics, const char* sep) diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h index fe1acca7976..e2b3f7b1ca6 100644 --- a/tools/winedump/winedump.h +++ b/tools/winedump/winedump.h @@ -233,7 +233,7 @@ const char* get_unicode_str( const WCHAR *str, int len ); const char* get_symbol_str(const char* symname); void print_fake_dll(void); void dump_file_header(const IMAGE_FILE_HEADER *, BOOL); -void dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *, UINT); +void dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *); void dump_section(const IMAGE_SECTION_HEADER *, const char* strtable); void dump_section_characteristics(DWORD characteristics, const char* sep);