aboutsummaryrefslogtreecommitdiff
path: root/bfd/ihex.c
diff options
context:
space:
mode:
authorrhn <sowaac.rhn@porcupinefactory.org>2018-11-09 14:09:44 +0000
committerNick Clifton <nickc@redhat.com>2018-11-09 14:09:44 +0000
commitd2eb0fb5a04e2e2ad374f56c7107f2421cdd93c9 (patch)
treeccecd4eda66e1e3458c3cf14248f1e4a48e7531b /bfd/ihex.c
parentdcd9adc5cbac756507eb5da65a4f9cf3edb8fc93 (diff)
downloadbinutils-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.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/bfd/ihex.c b/bfd/ihex.c
index 80bcbe9..b576ac7 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;