coff_close_and_cleanup

Message ID 20191229113916.GB16749@bubble.grove.modra.org
State New
Headers show
Series
  • coff_close_and_cleanup
Related show

Commit Message

Alan Modra Dec. 29, 2019, 11:39 a.m.
Fixes leaks in _bfd_coff_get_external_symbols and
_bfd_coff_read_string_table.

	* coffcode.h (coff_close_and_cleanup): Redefine to..
	* coffgen.c (_bfd_coff_close_and_cleanup): ..this.  New function.
	* libcoff-in.h (_bfd_coff_close_and_cleanup): Declare.
	* libcoff.h: Regenerate.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index ac5312fdb0..7bf7d68e03 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -5642,7 +5642,7 @@  static bfd_coff_backend_data bigobj_swap_table =
 #endif /* COFF_WITH_PE_BIGOBJ */
 
 #ifndef coff_close_and_cleanup
-#define coff_close_and_cleanup		    _bfd_generic_close_and_cleanup
+#define coff_close_and_cleanup		    _bfd_coff_close_and_cleanup
 #endif
 
 #ifndef coff_bfd_free_cached_info
diff --git a/bfd/coffgen.c b/bfd/coffgen.c
index 7f26e18c45..57a18b02dc 100644
--- a/bfd/coffgen.c
+++ b/bfd/coffgen.c
@@ -3161,3 +3161,18 @@  bfd_coff_group_name (bfd *abfd, const asection *sec)
     return ci->name;
   return NULL;
 }
+
+bfd_boolean
+_bfd_coff_close_and_cleanup (bfd *abfd)
+{
+  if (abfd->format == bfd_object
+      && bfd_family_coff (abfd)
+      && coff_data (abfd) != NULL)
+    {
+      obj_coff_keep_syms (abfd) = FALSE;
+      obj_coff_keep_strings (abfd) = FALSE;
+      if (!_bfd_coff_free_symbols (abfd))
+	return FALSE;
+    }
+  return _bfd_generic_close_and_cleanup (abfd);
+}
diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h
index 031622f018..a4623dd903 100644
--- a/bfd/libcoff-in.h
+++ b/bfd/libcoff-in.h
@@ -367,6 +367,8 @@  extern bfd_vma bfd_coff_reloc16_get_value
   (arelent *, struct bfd_link_info *, asection *);
 extern void bfd_perform_slip
   (bfd *, unsigned int, asection *, bfd_vma);
+extern bfd_boolean _bfd_coff_close_and_cleanup
+  (bfd *);
 
 /* Functions and types in cofflink.c.  */