1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

[DataExtractor] Improve error message when we run off the end of the buffer

Summary: Include the offset at which this happened.

Reviewers: dblaikie, jhenderson

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D75265
This commit is contained in:
Pavel Labath 2020-02-27 16:22:12 +01:00
parent 3ae1657c3e
commit 7d8c00606f
5 changed files with 23 additions and 19 deletions

View File

@ -15,10 +15,11 @@
using namespace llvm; using namespace llvm;
static void unexpectedEndReached(Error *E) { static void unexpectedEndReached(Error *E, uint64_t Offset) {
if (E) if (E)
*E = createStringError(errc::illegal_byte_sequence, *E = createStringError(errc::illegal_byte_sequence,
"unexpected end of data"); "unexpected end of data at offset 0x%" PRIx64,
Offset);
} }
static bool isError(Error *E) { return E && *E; } static bool isError(Error *E) { return E && *E; }
@ -33,7 +34,7 @@ static T getU(uint64_t *offset_ptr, const DataExtractor *de,
uint64_t offset = *offset_ptr; uint64_t offset = *offset_ptr;
if (!de->isValidOffsetForDataOfSize(offset, sizeof(T))) { if (!de->isValidOffsetForDataOfSize(offset, sizeof(T))) {
unexpectedEndReached(Err); unexpectedEndReached(Err, offset);
return val; return val;
} }
std::memcpy(&val, &Data[offset], sizeof(val)); std::memcpy(&val, &Data[offset], sizeof(val));
@ -56,7 +57,7 @@ static T *getUs(uint64_t *offset_ptr, T *dst, uint32_t count,
uint64_t offset = *offset_ptr; uint64_t offset = *offset_ptr;
if (!de->isValidOffsetForDataOfSize(offset, sizeof(*dst) * count)) { if (!de->isValidOffsetForDataOfSize(offset, sizeof(*dst) * count)) {
unexpectedEndReached(Err); unexpectedEndReached(Err, offset);
return nullptr; return nullptr;
} }
for (T *value_ptr = dst, *end = dst + count; value_ptr != end; for (T *value_ptr = dst, *end = dst + count; value_ptr != end;
@ -229,5 +230,5 @@ void DataExtractor::skip(Cursor &C, uint64_t Length) const {
if (isValidOffsetForDataOfSize(C.Offset, Length)) if (isValidOffsetForDataOfSize(C.Offset, Length))
C.Offset += Length; C.Offset += Length;
else else
unexpectedEndReached(&C.Err); unexpectedEndReached(&C.Err, C.Offset);
} }

View File

@ -8,11 +8,11 @@
# CHECK: DW_AT_name ("x1") # CHECK: DW_AT_name ("x1")
# CHECK-NEXT: DW_AT_location (0xdeadbeef # CHECK-NEXT: DW_AT_location (0xdeadbeef
# CHECK-NEXT: error: unexpected end of data) # CHECK-NEXT: error: unexpected end of data at offset 0xdeadbeef)
# CHECK: DW_AT_name ("x2") # CHECK: DW_AT_name ("x2")
# CHECK-NEXT: DW_AT_location (0x00000036 # CHECK-NEXT: DW_AT_location (0x00000036
# CHECK-NEXT: error: unexpected end of data) # CHECK-NEXT: error: unexpected end of data at offset 0x48)
.type f,@function .type f,@function

View File

@ -8,11 +8,11 @@
# CHECK: DW_AT_name ("x1") # CHECK: DW_AT_name ("x1")
# CHECK-NEXT: DW_AT_location (0xdeadbeef # CHECK-NEXT: DW_AT_location (0xdeadbeef
# CHECK-NEXT: error: unexpected end of data) # CHECK-NEXT: error: unexpected end of data at offset 0xdeadbeef)
# CHECK: DW_AT_name ("x2") # CHECK: DW_AT_name ("x2")
# CHECK-NEXT: DW_AT_location (0x00000025 # CHECK-NEXT: DW_AT_location (0x00000025
# CHECK-NEXT: error: unexpected end of data) # CHECK-NEXT: error: unexpected end of data at offset 0x34)
.type f,@function .type f,@function

View File

@ -41,13 +41,15 @@ TEST(DWARFDataExtractorTest, getInitialLength) {
auto ErrorResult = std::make_tuple(0, dwarf::DWARF32, 0); auto ErrorResult = std::make_tuple(0, dwarf::DWARF32, 0);
// Empty data. // Empty data.
EXPECT_THAT_EXPECTED(GetWithError({}), EXPECT_THAT_EXPECTED(
FailedWithMessage("unexpected end of data")); GetWithError({}),
FailedWithMessage("unexpected end of data at offset 0x0"));
EXPECT_EQ(GetWithoutError({}), ErrorResult); EXPECT_EQ(GetWithoutError({}), ErrorResult);
// Not long enough for the U32 field. // Not long enough for the U32 field.
EXPECT_THAT_EXPECTED(GetWithError({0x00, 0x01, 0x02}), EXPECT_THAT_EXPECTED(
FailedWithMessage("unexpected end of data")); GetWithError({0x00, 0x01, 0x02}),
FailedWithMessage("unexpected end of data at offset 0x0"));
EXPECT_EQ(GetWithoutError({0x00, 0x01, 0x02}), ErrorResult); EXPECT_EQ(GetWithoutError({0x00, 0x01, 0x02}), ErrorResult);
EXPECT_THAT_EXPECTED( EXPECT_THAT_EXPECTED(
@ -72,14 +74,15 @@ TEST(DWARFDataExtractorTest, getInitialLength) {
EXPECT_EQ(GetWithoutError({0xff, 0xff, 0xff, 0xf0}), ErrorResult); EXPECT_EQ(GetWithoutError({0xff, 0xff, 0xff, 0xf0}), ErrorResult);
// DWARF64 marker without the subsequent length field. // DWARF64 marker without the subsequent length field.
EXPECT_THAT_EXPECTED(GetWithError({0xff, 0xff, 0xff, 0xff}), EXPECT_THAT_EXPECTED(
FailedWithMessage("unexpected end of data")); GetWithError({0xff, 0xff, 0xff, 0xff}),
FailedWithMessage("unexpected end of data at offset 0x4"));
EXPECT_EQ(GetWithoutError({0xff, 0xff, 0xff, 0xff}), ErrorResult); EXPECT_EQ(GetWithoutError({0xff, 0xff, 0xff, 0xff}), ErrorResult);
// Not enough data for the U64 length. // Not enough data for the U64 length.
EXPECT_THAT_EXPECTED( EXPECT_THAT_EXPECTED(
GetWithError({0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03}), GetWithError({0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03}),
FailedWithMessage("unexpected end of data")); FailedWithMessage("unexpected end of data at offset 0x4"));
EXPECT_EQ(GetWithoutError({0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03}), EXPECT_EQ(GetWithoutError({0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03}),
ErrorResult); ErrorResult);

View File

@ -105,9 +105,9 @@ TEST(DWARFDie, getLocations) {
&ErrorInfoBase::message, &ErrorInfoBase::message,
"Unable to resolve indirect address 1 for: DW_LLE_startx_length"))); "Unable to resolve indirect address 1 for: DW_LLE_startx_length")));
EXPECT_THAT_EXPECTED(Die.getLocations(DW_AT_call_data_location), EXPECT_THAT_EXPECTED(
Failed<ErrorInfoBase>(testing::Property( Die.getLocations(DW_AT_call_data_location),
&ErrorInfoBase::message, "unexpected end of data"))); FailedWithMessage("unexpected end of data at offset 0x20"));
EXPECT_THAT_EXPECTED( EXPECT_THAT_EXPECTED(
Die.getLocations(DW_AT_call_data_value), Die.getLocations(DW_AT_call_data_value),