forked from OSchip/llvm-project
Fix use-after-free with profile remapping.
We need to keep the underlying profile reader alive as long as the profile data, because the profile data may contain StringRefs referring to strings in the reader's name table. llvm-svn: 349600
This commit is contained in:
parent
a6247e7cf4
commit
0b832095d7
|
@ -548,6 +548,9 @@ public:
|
|||
: SampleProfileReader(std::move(B), C, Underlying->getFormat()) {
|
||||
Profiles = std::move(Underlying->getProfiles());
|
||||
Summary = takeSummary(*Underlying);
|
||||
// Keep the underlying reader alive; the profile data may contain
|
||||
// StringRefs referencing names in its name table.
|
||||
UnderlyingReader = std::move(Underlying);
|
||||
}
|
||||
|
||||
/// Create a remapped sample profile from the given remapping file and
|
||||
|
@ -569,6 +572,7 @@ public:
|
|||
private:
|
||||
SymbolRemappingReader Remappings;
|
||||
DenseMap<SymbolRemappingReader::Key, FunctionSamples*> SampleMap;
|
||||
std::unique_ptr<SampleProfileReader> UnderlyingReader;
|
||||
};
|
||||
|
||||
} // end namespace sampleprof
|
||||
|
|
|
@ -128,11 +128,15 @@ struct SampleProfTest : ::testing::Test {
|
|||
|
||||
FunctionSamples *ReadFooSamples = Reader->getSamplesFor(FooName);
|
||||
ASSERT_TRUE(ReadFooSamples != nullptr);
|
||||
if (Format != SampleProfileFormat::SPF_Compact_Binary)
|
||||
ASSERT_EQ("_Z3fooi", ReadFooSamples->getName());
|
||||
ASSERT_EQ(7711u, ReadFooSamples->getTotalSamples());
|
||||
ASSERT_EQ(610u, ReadFooSamples->getHeadSamples());
|
||||
|
||||
FunctionSamples *ReadBarSamples = Reader->getSamplesFor(BarName);
|
||||
ASSERT_TRUE(ReadBarSamples != nullptr);
|
||||
if (Format != SampleProfileFormat::SPF_Compact_Binary)
|
||||
ASSERT_EQ("_Z3bari", ReadBarSamples->getName());
|
||||
ASSERT_EQ(20301u, ReadBarSamples->getTotalSamples());
|
||||
ASSERT_EQ(1437u, ReadBarSamples->getHeadSamples());
|
||||
ErrorOr<SampleRecord::CallTargetMap> CTMap =
|
||||
|
|
Loading…
Reference in New Issue