ECOFF slurp_relocs thinko

Message ID 20200518112931.GB1088@bubble.grove.modra.org
State New
Headers show
Series
  • ECOFF slurp_relocs thinko
Related show

Commit Message

In git commit 806470a219 I swapped the order of internal vs. external
relocs memory allocation in ecoff_slurp_reloc_table, the idea being
that the external reloc size can be sanity checked against file size.
However, that fails badly with bfd_alloc memory where releasing any
block also releases all more recently allocated blocks.

	* ecoff.c (ecoff_slurp_reloc_table): Malloc external_relocs so
	they can be freed without also freeing internal_relocs.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/bfd/ecoff.c b/bfd/ecoff.c
index 50a133b7ba..82267a889d 100644
--- a/bfd/ecoff.c
+++ b/bfd/ecoff.c
@@ -1626,7 +1626,7 @@  ecoff_slurp_reloc_table (bfd *abfd,
   amt = external_reloc_size * section->reloc_count;
   if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
     return FALSE;
-  external_relocs = _bfd_alloc_and_read (abfd, amt, amt);
+  external_relocs = _bfd_malloc_and_read (abfd, amt, amt);
   if (external_relocs == NULL)
     return FALSE;
 
@@ -1635,7 +1635,7 @@  ecoff_slurp_reloc_table (bfd *abfd,
   internal_relocs = (arelent *) bfd_alloc (abfd, amt);
   if (internal_relocs == NULL)
     {
-      bfd_release (abfd, external_relocs);
+      free (external_relocs);
       return FALSE;
     }
 
@@ -1703,7 +1703,7 @@  ecoff_slurp_reloc_table (bfd *abfd,
       (*backend->adjust_reloc_in) (abfd, &intern, rptr);
     }
 
-  bfd_release (abfd, external_relocs);
+  free (external_relocs);
 
   section->relocation = internal_relocs;