forked from OSchip/llvm-project
[Support] Fix error handling in DataExtractor::get[US]LEB128
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
This commit is contained in:
parent
a94c18fc20
commit
bb6d0b8e7b
|
@ -157,13 +157,13 @@ 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;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int64_t DataExtractor::getSLEB128(uint32_t *offset_ptr) const {
|
||||
int64_t result = 0;
|
||||
|
@ -178,10 +178,7 @@ 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);
|
||||
|
@ -189,3 +186,6 @@ int64_t DataExtractor::getSLEB128(uint32_t *offset_ptr) const {
|
|||
*offset_ptr = offset;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue