PE format allows to have variable length of Data Directories in PE Optional
Header. The exact number of Data Directories is stored in NumberOfRvaAndSizes
field. Size of the optional header depends on the number of Data Directories.

Constants IMAGE_SIZEOF_NT_OPTIONAL32_HEADER and 
IMAGE_SIZEOF_NT_OPTIONAL64_HEADER
are for PE images with all 16 Data Directories. And so cannot be used for
checking validity of SizeOfOptionalHeader.

Older PE linkers were generating PE binaries with less number of Data
Directories than 16 if trailing entries were empty. And gendef cannot
recognize such PE binaries.

Relax check for PE SizeOfOptionalHeader field. Allow any number of Data
Directories in PE Optional Header, including zero.
---
 mingw-w64-tools/gendef/src/gendef.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/mingw-w64-tools/gendef/src/gendef.c 
b/mingw-w64-tools/gendef/src/gendef.c
index 7440d60f35df..ae9603fe1a3a 100644
--- a/mingw-w64-tools/gendef/src/gendef.c
+++ b/mingw-w64-tools/gendef/src/gendef.c
@@ -313,19 +313,19 @@ load_pep (void)
       gPEDta = NULL;
       return 0;
     }
-  if (gPEDta->FileHeader.SizeOfOptionalHeader == 
IMAGE_SIZEOF_NT_OPTIONAL32_HEADER
+  if (gPEDta->FileHeader.SizeOfOptionalHeader >= 
IMAGE_SIZEOF_NT_OPTIONAL32_HEADER-sizeof(gPEDta->OptionalHeader.DataDirectory)
       && gPEDta->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
     {
       gPEPDta = NULL;
       fprintf (stderr, " * [%s] Found PE image\n", fninput);
     }
-  else if (gPEDta->FileHeader.SizeOfOptionalHeader == 
IMAGE_SIZEOF_NT_OPTIONAL32_HEADER
+  else if (gPEDta->FileHeader.SizeOfOptionalHeader >= 
IMAGE_SIZEOF_NT_OPTIONAL32_HEADER-sizeof(gPEDta->OptionalHeader.DataDirectory)
       && gPEDta->OptionalHeader.Magic == 0 && gPEDta->FileHeader.Machine == 
0x014c /* IMAGE_FILE_MACHINE_I386 */)
     {
       gPEPDta = NULL;
       fprintf (stderr, " * [%s] Found PE image for I386 with zeroed NT 
magic\n", fninput);
     }
-  else if (gPEPDta->FileHeader.SizeOfOptionalHeader == 
IMAGE_SIZEOF_NT_OPTIONAL64_HEADER
+  else if (gPEPDta->FileHeader.SizeOfOptionalHeader >= 
IMAGE_SIZEOF_NT_OPTIONAL64_HEADER-sizeof(gPEPDta->OptionalHeader.DataDirectory)
     && gPEPDta->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
     {
       gPEDta = NULL;
-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to