diff options
author | rhn <sowaac.rhn@porcupinefactory.org> | 2018-11-09 14:09:44 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2018-11-09 14:09:44 +0000 |
commit | d2eb0fb5a04e2e2ad374f56c7107f2421cdd93c9 (patch) | |
tree | ccecd4eda66e1e3458c3cf14248f1e4a48e7531b /bfd/ihex.c | |
parent | dcd9adc5cbac756507eb5da65a4f9cf3edb8fc93 (diff) | |
download | binutils-d2eb0fb5a04e2e2ad374f56c7107f2421cdd93c9.zip binutils-d2eb0fb5a04e2e2ad374f56c7107f2421cdd93c9.tar.gz binutils-d2eb0fb5a04e2e2ad374f56c7107f2421cdd93c9.tar.bz2 |
Stop corruption of ihex output shen addresses are sign extended.
PR 23699
* ihex.c (ihex_write_object_contents): Check for sign extended
addresses that cannot be supported in the ihex format.
Diffstat (limited to 'bfd/ihex.c')
-rw-r--r-- | bfd/ihex.c | 18 |
1 files changed, 18 insertions, 0 deletions
@@ -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; |