This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][Binutils]: Fix range check in ihex PR/24065 for 32 bit hosts.


On Tue, Jan 08, 2019 at 10:15:20AM +0000, Tamar Christina wrote:
> The change in PR binutils/24065 added a check to see if the value is in a 32-bit range.
> It does this using two 64-bit masks that are stored inside a bfd_vma.

Which isn't the cleanest way to check.

> This now rejects all values on a 32-bit host as bfd_vma seems host dependent.

Right.  So let's fix the logic here rather than forcing 64-bit
compares.

	PR 23699
	PR 24065
	* ihex.c (ihex_write_object_contents): Properly check 32-bit
	address range.

diff --git a/bfd/ihex.c b/bfd/ihex.c
index 5d7d8fffea..101e0a7615 100644
--- a/bfd/ihex.c
+++ b/bfd/ihex.c
@@ -775,25 +775,29 @@ 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;
-       }
-
+#ifdef BFD64
+      /* IHex only supports 32-bit addresses, and we want to check
+	 that 64-bit addresses are in range.  This isn't quite as
+	 obvious as it may seem, since some targets have 32-bit
+	 addresses that are sign extended to 64 bits.  So complain
+	 only if addresses overflow both unsigned and signed 32-bit
+	 integers.  */
+      if (where > 0xffffffff
+	  && where + 0x80000000 > 0xffffffff)
+	{
+	  _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;
+#endif
 
       p = l->data;
       count = l->size;

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]