PR24065, 32-bit objcopy fails with 64-bit address ... out of range

PR 23699
	PR 24065
	* ihex.c (ihex_write_object_contents): Properly check 32-bit
	address range.
This commit is contained in:
Alan Modra 2019-01-08 22:21:57 +10:30
parent 171b8e1957
commit a9859e0172
2 changed files with 26 additions and 15 deletions

View File

@ -1,3 +1,10 @@
2019-01-08 Alan Modra <amodra@gmail.com>
PR 23699
PR 24065
* ihex.c (ihex_write_object_contents): Properly check 32-bit
address range.
2019-01-05 Yoshinori Sato <ysato@users.sourceforge.jp>
* bfd/archures.c: Add bfd_mach_rx_v2 and bfd_mach_rx_v3.

View File

@ -775,25 +775,29 @@ ihex_write_object_contents (bfd *abfd)
bfd_vma where;
bfd_byte *p;
bfd_size_type count;
const bfd_vma sign = (bfd_vma) 0xffffffff80000000ULL;
const bfd_vma top = (bfd_vma) 0xffffffff00000000ULL;
where = l->where;
/* Check for unacceptable addresses sign extension.
See PR 23699 for more details. */
if ((where & sign) == top
|| ((where & top) != 0 && (where & top) != top))
{
_bfd_error_handler
/* xgettext:c-format */
(_("%pB 64-bit address %#" PRIx64 " out of range for Intel Hex file"),
abfd, (uint64_t) where);
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
#ifdef BFD64
/* IHex only supports 32-bit addresses, and we want to check
that 64-bit addresses are in range. This isn't quite as
obvious as it may seem, since some targets have 32-bit
addresses that are sign extended to 64 bits. So complain
only if addresses overflow both unsigned and signed 32-bit
integers. */
if (where > 0xffffffff
&& where + 0x80000000 > 0xffffffff)
{
_bfd_error_handler
/* xgettext:c-format */
(_("%pB 64-bit address %#" PRIx64
" out of range for Intel Hex file"),
abfd, (uint64_t) where);
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
where &= 0xffffffff;
#endif
p = l->data;
count = l->size;