Skip to content

Commit

Permalink
[Support] Fix error handling in DataExtractor::get[US]LEB128
Browse files Browse the repository at this point in the history
Summary:
These functions are documented as not modifying the offset argument if
the extraction fails (just like other DataExtractor functions). However,
while reviewing D63591 we discovered that this is not the case -- if the
function reaches the end of the data buffer, it will just return the
value parsed until that point and set offset to point to the end of the
buffer.

This fixes the functions to act as advertised, and adds a regression
test.

Reviewers: dblaikie, probinson, bkramer

Subscribers: kristina, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D63645

llvm-svn: 364169
  • Loading branch information
labath committed Jun 24, 2019
1 parent a94c18f commit bb6d0b8
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 14 deletions.
28 changes: 14 additions & 14 deletions llvm/lib/Support/DataExtractor.cpp
Expand Up @@ -157,12 +157,12 @@ uint64_t DataExtractor::getULEB128(uint32_t *offset_ptr) const {
byte = Data[offset++];
result |= uint64_t(byte & 0x7f) << shift;
shift += 7;
if ((byte & 0x80) == 0)
break;
if ((byte & 0x80) == 0) {
*offset_ptr = offset;
return result;
}
}

*offset_ptr = offset;
return result;
return 0;
}

int64_t DataExtractor::getSLEB128(uint32_t *offset_ptr) const {
Expand All @@ -178,14 +178,14 @@ int64_t DataExtractor::getSLEB128(uint32_t *offset_ptr) const {
byte = Data[offset++];
result |= uint64_t(byte & 0x7f) << shift;
shift += 7;
if ((byte & 0x80) == 0)
break;
if ((byte & 0x80) == 0) {
// Sign bit of byte is 2nd high order bit (0x40)
if (shift < 64 && (byte & 0x40))
result |= -(1ULL << shift);

*offset_ptr = offset;
return result;
}
}

// Sign bit of byte is 2nd high order bit (0x40)
if (shift < 64 && (byte & 0x40))
result |= -(1ULL << shift);

*offset_ptr = offset;
return result;
return 0;
}
10 changes: 10 additions & 0 deletions llvm/unittests/Support/DataExtractorTest.cpp
Expand Up @@ -116,4 +116,14 @@ TEST(DataExtractorTest, LEB128) {
EXPECT_EQ(8U, offset);
}

TEST(DataExtractorTest, LEB128_error) {
DataExtractor DE(StringRef("\x81"), false, 8);
uint32_t Offset = 0;
EXPECT_EQ(0U, DE.getULEB128(&Offset));
EXPECT_EQ(0U, Offset);

Offset = 0;
EXPECT_EQ(0U, DE.getSLEB128(&Offset));
EXPECT_EQ(0U, Offset);
}
}

0 comments on commit bb6d0b8

Please sign in to comment.