About undefined shift and integer overflow issues (cherry picked from commit 30b34d883dc099fbe68fe522bedbacc09c74eda6)
66 lines
1.8 KiB
Diff
66 lines
1.8 KiB
Diff
From 7b54caddca1013d10219da097e08d4cd4db6b923 Mon Sep 17 00:00:00 2001
|
|
From: Alan Modra <amodra@gmail.com>
|
|
Date: Tue, 16 Feb 2021 19:27:24 +1030
|
|
Subject: [PATCH] ubsan: shift exponent is too large
|
|
|
|
Reference: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=7b54caddca1013d10219da097e08d4cd4db6b923
|
|
|
|
* libbfd.c (_bfd_read_unsigned_leb128): Avoid excessive shift.
|
|
(_bfd_safe_read_leb128, _bfd_read_signed_leb128): Likewise.
|
|
---
|
|
bfd/ChangeLog | 5 +++++
|
|
bfd/libbfd.c | 23 +++++++++++++++--------
|
|
2 files changed, 20 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/bfd/libbfd.c b/bfd/libbfd.c
|
|
index cd94b81bc43..4f3dd5ad53c 100644
|
|
--- a/bfd/libbfd.c
|
|
+++ b/bfd/libbfd.c
|
|
@@ -1074,8 +1074,11 @@ _bfd_read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
|
|
byte = bfd_get_8 (abfd, buf);
|
|
buf++;
|
|
num_read++;
|
|
- result |= (((bfd_vma) byte & 0x7f) << shift);
|
|
- shift += 7;
|
|
+ if (shift < 8 * sizeof (result))
|
|
+ {
|
|
+ result |= (((bfd_vma) byte & 0x7f) << shift);
|
|
+ shift += 7;
|
|
+ }
|
|
}
|
|
while (byte & 0x80);
|
|
*bytes_read_ptr = num_read;
|
|
@@ -1104,10 +1107,11 @@ _bfd_safe_read_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
|
|
byte = bfd_get_8 (abfd, data);
|
|
data++;
|
|
num_read++;
|
|
-
|
|
- result |= ((bfd_vma) (byte & 0x7f)) << shift;
|
|
-
|
|
- shift += 7;
|
|
+ if (shift < 8 * sizeof (result))
|
|
+ {
|
|
+ result |= ((bfd_vma) (byte & 0x7f)) << shift;
|
|
+ shift += 7;
|
|
+ }
|
|
if ((byte & 0x80) == 0)
|
|
break;
|
|
}
|
|
@@ -1141,8 +1145,11 @@ _bfd_read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
|
|
byte = bfd_get_8 (abfd, buf);
|
|
buf ++;
|
|
num_read ++;
|
|
- result |= (((bfd_vma) byte & 0x7f) << shift);
|
|
- shift += 7;
|
|
+ if (shift < 8 * sizeof (result))
|
|
+ {
|
|
+ result |= (((bfd_vma) byte & 0x7f) << shift);
|
|
+ shift += 7;
|
|
+ }
|
|
}
|
|
while (byte & 0x80);
|
|
if (shift < 8 * sizeof (result) && (byte & 0x40))
|
|
--
|
|
2.19.1
|
|
|