This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH][Binutils]: Fix range check in ihex PR/24065 for 32 bit hosts.
- From: Alan Modra <amodra at gmail dot com>
- To: Tamar Christina <Tamar dot Christina at arm dot com>
- Cc: "binutils at sourceware dot org" <binutils at sourceware dot org>, nd <nd at arm dot com>
- Date: Tue, 8 Jan 2019 22:30:52 +1030
- Subject: Re: [PATCH][Binutils]: Fix range check in ihex PR/24065 for 32 bit hosts.
- References: <20190108101516.GA16370@arm.com>
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