ECOFF slurp_relocs thinko
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.
This commit is contained in:
parent
ca859a8939
commit
7a87e9c805
|
@ -1,3 +1,8 @@
|
||||||
|
2020-05-18 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* ecoff.c (ecoff_slurp_reloc_table): Malloc external_relocs so
|
||||||
|
they can be freed without also freeing internal_relocs.
|
||||||
|
|
||||||
2020-05-18 Jaydeep Chauhan <jaydeepchauhan1494@gmail.com>
|
2020-05-18 Jaydeep Chauhan <jaydeepchauhan1494@gmail.com>
|
||||||
|
|
||||||
PR 25713
|
PR 25713
|
||||||
|
|
|
@ -1626,7 +1626,7 @@ ecoff_slurp_reloc_table (bfd *abfd,
|
||||||
amt = external_reloc_size * section->reloc_count;
|
amt = external_reloc_size * section->reloc_count;
|
||||||
if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
|
if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
external_relocs = _bfd_alloc_and_read (abfd, amt, amt);
|
external_relocs = _bfd_malloc_and_read (abfd, amt, amt);
|
||||||
if (external_relocs == NULL)
|
if (external_relocs == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -1635,7 +1635,7 @@ ecoff_slurp_reloc_table (bfd *abfd,
|
||||||
internal_relocs = (arelent *) bfd_alloc (abfd, amt);
|
internal_relocs = (arelent *) bfd_alloc (abfd, amt);
|
||||||
if (internal_relocs == NULL)
|
if (internal_relocs == NULL)
|
||||||
{
|
{
|
||||||
bfd_release (abfd, external_relocs);
|
free (external_relocs);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1703,7 +1703,7 @@ ecoff_slurp_reloc_table (bfd *abfd,
|
||||||
(*backend->adjust_reloc_in) (abfd, &intern, rptr);
|
(*backend->adjust_reloc_in) (abfd, &intern, rptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bfd_release (abfd, external_relocs);
|
free (external_relocs);
|
||||||
|
|
||||||
section->relocation = internal_relocs;
|
section->relocation = internal_relocs;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue