mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
[InstrProf] Tighten a check for malformed data records in raw profiles
The check needs to validate a counter offset before performing pointer arithmetic with the (potentially corrupt) offset. Found by UBSan's pointer overflow check. rdar://54843625 Differential Revision: https://reviews.llvm.org/D66979 llvm-svn: 370826
This commit is contained in:
parent
a685e6f312
commit
9e3b309561
@ -268,8 +268,14 @@ private:
|
||||
return (const char *)ValueDataStart;
|
||||
}
|
||||
|
||||
const uint64_t *getCounter(IntPtrT CounterPtr) const {
|
||||
ptrdiff_t Offset = (swap(CounterPtr) - CountersDelta) / sizeof(uint64_t);
|
||||
/// Get the offset of \p CounterPtr from the start of the counters section of
|
||||
/// the profile. The offset has units of "number of counters", i.e. increasing
|
||||
/// the offset by 1 corresponds to an increase in the *byte offset* by 8.
|
||||
ptrdiff_t getCounterOffset(IntPtrT CounterPtr) const {
|
||||
return (swap(CounterPtr) - CountersDelta) / sizeof(uint64_t);
|
||||
}
|
||||
|
||||
const uint64_t *getCounter(ptrdiff_t Offset) const {
|
||||
return CountersStart + Offset;
|
||||
}
|
||||
|
||||
|
@ -413,13 +413,19 @@ Error RawInstrProfReader<IntPtrT>::readRawCounts(
|
||||
if (NumCounters == 0)
|
||||
return error(instrprof_error::malformed);
|
||||
|
||||
auto RawCounts = makeArrayRef(getCounter(CounterPtr), NumCounters);
|
||||
auto *NamesStartAsCounter = reinterpret_cast<const uint64_t *>(NamesStart);
|
||||
ptrdiff_t MaxNumCounters = NamesStartAsCounter - CountersStart;
|
||||
|
||||
// Check bounds.
|
||||
if (RawCounts.data() < CountersStart ||
|
||||
RawCounts.data() + RawCounts.size() > NamesStartAsCounter)
|
||||
// Check bounds. Note that the counter pointer embedded in the data record
|
||||
// may itself be corrupt.
|
||||
if (NumCounters > MaxNumCounters)
|
||||
return error(instrprof_error::malformed);
|
||||
ptrdiff_t CounterOffset = getCounterOffset(CounterPtr);
|
||||
if (CounterOffset < 0 || CounterOffset > MaxNumCounters ||
|
||||
(CounterOffset + NumCounters) > MaxNumCounters)
|
||||
return error(instrprof_error::malformed);
|
||||
|
||||
auto RawCounts = makeArrayRef(getCounter(CounterOffset), NumCounters);
|
||||
|
||||
if (ShouldSwapBytes) {
|
||||
Record.Counts.clear();
|
||||
|
Binary file not shown.
@ -0,0 +1,5 @@
|
||||
REQUIRES: zlib
|
||||
|
||||
RUN: not llvm-profdata merge -o /dev/null %p/Inputs/malformed-ptr-to-counter-array.profraw 2>&1 | FileCheck %s
|
||||
|
||||
CHECK: Malformed instrumentation profile data
|
Loading…
Reference in New Issue
Block a user