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))
