PR25648, objcopy SIGSEGV in ihex_write_record

ihex_set_section_contents sorts records stored on the tdata.ihex_data
list by address, but ihex_write_object_contents went too far in
assuming they were not overlapping.  This patch fixes the problem by
not assuming anything about addresses in ihex_write_object_contents.

	PR 25648
	* ihex.c (ihex_write_object_contents): Don't assume ordering of
	addresses here.  Remove dead code.
This commit is contained in:
Alan Modra 2020-03-10 10:46:17 +10:30
parent 384f368958
commit 6b5e16ffd3
2 changed files with 10 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2020-03-10 Alan Modra <amodra@gmail.com>
PR 25648
* ihex.c (ihex_write_object_contents): Don't assume ordering of
addresses here.
2020-03-09 Alan Modra <amodra@gmail.com>
* wasm-module.c (wasm_scan): Sanity check file name length

View File

@ -811,16 +811,15 @@ ihex_write_object_contents (bfd *abfd)
if (count > CHUNK)
now = CHUNK;
if (where > segbase + extbase + 0xffff)
if (where < extbase
|| where - extbase < segbase
|| where - extbase - segbase > 0xffff)
{
bfd_byte addr[2];
/* We need a new base address. */
if (where <= 0xfffff)
if (extbase == 0 && where <= 0xfffff)
{
/* The addresses should be sorted. */
BFD_ASSERT (extbase == 0);
segbase = where & 0xf0000;
addr[0] = (bfd_byte)(segbase >> 12) & 0xff;
addr[1] = (bfd_byte)(segbase >> 4) & 0xff;