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>
feature/deterministic
Dmitry Timoshkov 2020-05-06 15:15:54 +08:00 committed by Alexandre Julliard
parent 893080e4df
commit ae9eb36e21
1 changed files with 3 additions and 2 deletions

View File

@ -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)
{