From d2eb0fb5a04e2e2ad374f56c7107f2421cdd93c9 Mon Sep 17 00:00:00 2001 From: rhn Date: Fri, 9 Nov 2018 14:09:44 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 6 ++++++ bfd/ihex.c | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index cce59683172..216271a3cfe 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 80bcbe9f90a..b576ac72c59 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; -- 2.30.2