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:
Richard Smith 2018-12-19 03:24:03 +00:00
parent a6247e7cf4
commit 0b832095d7
2 changed files with 8 additions and 0 deletions

View File

@ -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

View File

@ -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 =