From 11acfd478b7ddac9f9af6fc9cd72d5f4897a4b83 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 19 Dec 2018 03:24:03 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349600 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ProfileData/SampleProfReader.h | 4 ++++ unittests/ProfileData/SampleProfTest.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/include/llvm/ProfileData/SampleProfReader.h b/include/llvm/ProfileData/SampleProfReader.h index 3c477cc3471..5cc729e42cc 100644 --- a/include/llvm/ProfileData/SampleProfReader.h +++ b/include/llvm/ProfileData/SampleProfReader.h @@ -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 SampleMap; + std::unique_ptr UnderlyingReader; }; } // end namespace sampleprof diff --git a/unittests/ProfileData/SampleProfTest.cpp b/unittests/ProfileData/SampleProfTest.cpp index 67e6e9fc95b..a31eccefb4d 100644 --- a/unittests/ProfileData/SampleProfTest.cpp +++ b/unittests/ProfileData/SampleProfTest.cpp @@ -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 CTMap = -- 2.50.1