From: Richard Smith Date: Wed, 19 Dec 2018 03:24:03 +0000 (+0000) Subject: Fix use-after-free with profile remapping. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=11acfd478b7ddac9f9af6fc9cd72d5f4897a4b83;p=llvm 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 --- 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 =