forked from Imagelibrary/binutils-gdb
* int_encoding.cc (read_unsigned_LEB_128): Replaced with inline
definition and ... (read_unsigned_LEB_128_x): ... this new function. (read_signed_LEB_128): Replaced with inline definition and ... (read_signed_LEB_128_x): ... this new function. * int_encoding.h (read_unsigned_LEB_128_x): New function. (read_unsigned_LEB_128): Add inline definition. (read_signed_LEB_128_x): New function. (read_signed_LEB_128): Add inline definition. * testsuite/Makefile.am (leb128_unittest): New unit test. * testsuite/Makefile.in: Regenerate. * testsuite/leb128_unittest.cc: New unit test.
This commit is contained in:
@@ -32,19 +32,20 @@ namespace gold {
|
||||
|
||||
// Read an unsigned LEB128 number. Each byte contains 7 bits of
|
||||
// information, plus one bit saying whether the number continues or
|
||||
// not.
|
||||
// not. BYTE contains the first byte of the number, and is guaranteed
|
||||
// to have the continuation bit set.
|
||||
|
||||
uint64_t
|
||||
read_unsigned_LEB_128(const unsigned char* buffer, size_t* len)
|
||||
read_unsigned_LEB_128_x(const unsigned char* buffer, size_t* len,
|
||||
unsigned char byte)
|
||||
{
|
||||
uint64_t result = 0;
|
||||
size_t num_read = 0;
|
||||
unsigned int shift = 0;
|
||||
unsigned char byte;
|
||||
uint64_t result = static_cast<uint64_t>(byte & 0x7f);
|
||||
size_t num_read = 1;
|
||||
unsigned int shift = 7;
|
||||
|
||||
do
|
||||
{
|
||||
if (num_read >= 64 / 7)
|
||||
if (num_read > 64 / 7 + 1)
|
||||
{
|
||||
gold_warning(_("Unusually large LEB128 decoded, "
|
||||
"debug information may be corrupted"));
|
||||
@@ -64,18 +65,20 @@ read_unsigned_LEB_128(const unsigned char* buffer, size_t* len)
|
||||
|
||||
// Read a signed LEB128 number. These are like regular LEB128
|
||||
// numbers, except the last byte may have a sign bit set.
|
||||
// BYTE contains the first byte of the number, and is guaranteed
|
||||
// to have the continuation bit set.
|
||||
|
||||
int64_t
|
||||
read_signed_LEB_128(const unsigned char* buffer, size_t* len)
|
||||
read_signed_LEB_128_x(const unsigned char* buffer, size_t* len,
|
||||
unsigned char byte)
|
||||
{
|
||||
int64_t result = 0;
|
||||
int shift = 0;
|
||||
size_t num_read = 0;
|
||||
unsigned char byte;
|
||||
int64_t result = static_cast<uint64_t>(byte & 0x7f);
|
||||
int shift = 7;
|
||||
size_t num_read = 1;
|
||||
|
||||
do
|
||||
{
|
||||
if (num_read >= 64 / 7)
|
||||
if (num_read > 64 / 7 + 1)
|
||||
{
|
||||
gold_warning(_("Unusually large LEB128 decoded, "
|
||||
"debug information may be corrupted"));
|
||||
|
||||
Reference in New Issue
Block a user