ubsan: shift exponent is too large

* libbfd.c (_bfd_read_unsigned_leb128): Avoid excessive shift.
	(_bfd_safe_read_leb128, _bfd_read_signed_leb128): Likewise.
This commit is contained in:
Alan Modra 2021-02-16 19:27:24 +10:30
parent 9a12b194b0
commit 7b54caddca
2 changed files with 20 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2021-02-16 Alan Modra <amodra@gmail.com>
* libbfd.c (_bfd_read_unsigned_leb128): Avoid excessive shift.
(_bfd_safe_read_leb128, _bfd_read_signed_leb128): Likewise.
2021-02-15 Jan Beulich <jbeulich@suse.com>
* doc/Makefile.am: Replace "cp -p" by "$(LN_S)".

View File

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