diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cce5968317..216271a3cf 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2018-11-09 rhn + + PR 23699 + * ihex.c (ihex_write_object_contents): Check for sign extended + addresses that cannot be supported in the ihex format. + 2018-11-09 Claudiu Zissulescu * arc-got.h (arc_get_local_got_ents): Revamp it; use diff --git a/bfd/ihex.c b/bfd/ihex.c index 80bcbe9f90..b576ac72c5 100644 --- a/bfd/ihex.c +++ b/bfd/ihex.c @@ -775,8 +775,26 @@ 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; + } + + where &= 0xffffffff; + p = l->data; count = l->size;