Module: wine Branch: master Commit: ae9eb36e21c9b8e31b1e4a4c1eb6deae9b90262d URL: https://source.winehq.org/git/wine.git/?a=commit;h=ae9eb36e21c9b8e31b1e4a4c1...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Wed May 6 15:15:54 2020 +0800
server: All fields up to CheckSum are mandatory regardless of SizeOfOptionalHeader value.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=42125 Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru Signed-off-by: Alexandre Julliard julliard@winehq.org
---
server/mapping.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/server/mapping.c b/server/mapping.c index 6970c86ffc..ffd20450df 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -580,7 +580,7 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s } opt; } nt; off_t pos; - int size; + int size, opt_size; size_t mz_size, clr_va, clr_size; unsigned int i, cpu_mask = get_supported_cpu_mask();
@@ -596,7 +596,8 @@ 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 */ - size = min( size, sizeof(nt.Signature) + sizeof(nt.FileHeader) + nt.FileHeader.SizeOfOptionalHeader ); + 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) {