rescoff: ensure file is PE

Message ID Z8YkZv3SkMKuNTxL@squeak.grove.modra.org
State New
Headers
Series rescoff: ensure file is PE |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 fail Patch failed to apply
linaro-tcwg-bot/tcwg_binutils_build--master-arm fail Patch failed to apply

Commit Message

Alan Modra March 3, 2025, 9:51 p.m. UTC
  read_coff_rsrc makes one check on object file contents, the existence
of a .rsrc section.  It doesn't check that the file is PE but blindly
accesses bfd pe_data.  Fix that by adding the necessary checks.
Also, the "resources nest too deep" error isn't an overrun, ie. the
"address out of bounds" message isn't correct.  Fix that too.
  

Patch

diff --git a/binutils/rescoff.c b/binutils/rescoff.c
index 200d0a3988c..f9a1e70d162 100644
--- a/binutils/rescoff.c
+++ b/binutils/rescoff.c
@@ -133,6 +133,9 @@  read_coff_rsrc (const char *filename, const char *target)
 	list_matching_formats (matching);
       xexit (1);
     }
+  if (bfd_get_flavour (abfd) != bfd_target_coff_flavour
+      || !obj_pe (abfd))
+    fatal (_("%s: not a PE file"), filename);
 
   sec = bfd_get_section_by_name (abfd, ".rsrc");
   if (sec == NULL)
@@ -196,7 +199,7 @@  read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
      Microsoft only defines 3 levels.  Corrupt files however might
      claim to use more.  */
   if (level > 4)
-    overrun (flaginfo, _("Resources nest too deep"));
+    fatal (_("%s: resources nest too deep"), flaginfo->filename);
 
   if ((size_t) (flaginfo->data_end - data) < sizeof (struct extern_res_directory))
     overrun (flaginfo, _("directory"));