61 lines
1.6 KiB
Diff
61 lines
1.6 KiB
Diff
From 08d7da7dc9e130cbaf072c2588e1b392c2d7503e Mon Sep 17 00:00:00 2001
|
|
From: Nick Clifton <nickc@redhat.com>
|
|
Date: Fri, 28 Aug 2020 16:04:49 +0100
|
|
Subject: [PATCH] Fix a bogus error message from the DWARF LEB129 decoder when
|
|
trying to read a signed LEB128 value containing the largest possible signed
|
|
negative integer value.
|
|
|
|
PR 26548
|
|
* dwarf.c (read_leb128): When checking for overflow of a signed
|
|
read, use a signed shift.
|
|
---
|
|
binutils/dwarf.c | 28 +++++++++++++++++++++-------
|
|
1 files changed, 21 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
|
|
index 52759948718..616e5348490 100644
|
|
--- a/binutils/dwarf.c
|
|
+++ b/binutils/dwarf.c
|
|
@@ -345,20 +345,34 @@ read_leb128 (unsigned char *data,
|
|
while (data < end)
|
|
{
|
|
unsigned char byte = *data++;
|
|
+ bfd_boolean cont = (byte & 0x80) ? TRUE : FALSE;
|
|
+
|
|
+ byte &= 0x7f;
|
|
num_read++;
|
|
|
|
if (shift < sizeof (result) * 8)
|
|
{
|
|
- result |= ((dwarf_vma) (byte & 0x7f)) << shift;
|
|
- if ((result >> shift) != (byte & 0x7f))
|
|
- /* Overflow. */
|
|
- status |= 2;
|
|
+ result |= ((dwarf_vma) byte) << shift;
|
|
+ if (sign)
|
|
+ {
|
|
+ if ((((dwarf_signed_vma) result >> shift) & 0x7f) != byte)
|
|
+ /* Overflow. */
|
|
+ status |= 2;
|
|
+ }
|
|
+ else if ((result >> shift) != byte)
|
|
+ {
|
|
+ /* Overflow. */
|
|
+ status |= 2;
|
|
+ }
|
|
+
|
|
shift += 7;
|
|
}
|
|
- else if ((byte & 0x7f) != 0)
|
|
- status |= 2;
|
|
+ else if (byte != 0)
|
|
+ {
|
|
+ status |= 2;
|
|
+ }
|
|
|
|
- if ((byte & 0x80) == 0)
|
|
+ if (!cont)
|
|
{
|
|
status &= ~1;
|
|
if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
|