Stop corruption of ihex output shen addresses are sign extended.
authorrhn <sowaac.rhn@porcupinefactory.org>
Fri, 9 Nov 2018 14:09:44 +0000 (14:09 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 9 Nov 2018 14:09:44 +0000 (14:09 +0000)
PR 23699
* ihex.c (ihex_write_object_contents): Check for sign extended
addresses that cannot be supported in the ihex format.

bfd/ChangeLog
bfd/ihex.c

index cce59683172157596a663a1ada7e5ce606cdbf5c..216271a3cfeac74338ea38d9bf36950d4b15fec4 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-09  rhn  <sowaac.rhn@porcupinefactory.org>
+
+       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  <claziss@synopsys.com>
 
        * arc-got.h (arc_get_local_got_ents): Revamp it; use
index 80bcbe9f90a412a461e1504175b86b2f21d88654..b576ac72c5932e99cd40d4ad6ab93ecd642e054a 100644 (file)
@@ -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;