mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +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:
parent
3ae1657c3e
commit
7d8c00606f
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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),
|
||||||
|
Loading…
Reference in New Issue
Block a user