From 08d7da7dc9e130cbaf072c2588e1b392c2d7503e Mon Sep 17 00:00:00 2001 From: Nick Clifton 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/ChangeLog | 6 ++++++ binutils/dwarf.c | 28 +++++++++++++++++++++------- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 8a6cadcc1c..ca9028688f 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2020-08-28 Nick Clifton + + PR 26548 + * dwarf.c (read_leb128): When checking for overflow of a signed + read, use a signed shift. + 2020-08-28 Cooper Qu * readelf.c (get_csky_section_type_name): New. diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 5275994871..616e534849 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)) -- 2.34.1