ECOFF slurp_relocs thinko

Message ID
State New
Headers show
  • 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


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;