diff options
author | Vedant Kumar <vsk@apple.com> | 2016-06-03 23:12:38 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2016-06-03 23:12:38 +0000 |
commit | 8a3d717868c3dcca1f4b742b9c2d1232660556c3 (patch) | |
tree | a63fadf5862e69df3f9746cf2719cb58ac3f0c3a /llvm/tools/llvm-profdata/llvm-profdata.cpp | |
parent | 400e4c34d36df3b8571cb92f297efa7a060480af (diff) | |
download | bcm5719-llvm-8a3d717868c3dcca1f4b742b9c2d1232660556c3.tar.gz bcm5719-llvm-8a3d717868c3dcca1f4b742b9c2d1232660556c3.zip |
[llvm-profdata] Fix use-after-free from discarded MemoryBuffer (NFC)
Thanks to Justin Bogner for pointing this out!
Caught by ASAN.
llvm-svn: 271748
Diffstat (limited to 'llvm/tools/llvm-profdata/llvm-profdata.cpp')
-rw-r--r-- | llvm/tools/llvm-profdata/llvm-profdata.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/llvm/tools/llvm-profdata/llvm-profdata.cpp b/llvm/tools/llvm-profdata/llvm-profdata.cpp index 118a7eba7b7..45f348747db 100644 --- a/llvm/tools/llvm-profdata/llvm-profdata.cpp +++ b/llvm/tools/llvm-profdata/llvm-profdata.cpp @@ -223,16 +223,19 @@ static WeightedFile parseWeightedFile(const StringRef &WeightedFilename) { return WeightedFile(FileName, Weight); } -static void parseInputFilenamesFile(const StringRef &InputFilenamesFile, - WeightedFileVector &WFV) { +static std::unique_ptr<MemoryBuffer> +parseInputFilenamesFile(const StringRef &InputFilenamesFile, + WeightedFileVector &WFV) { if (InputFilenamesFile == "") - return; + return {}; - auto Buf = MemoryBuffer::getFileOrSTDIN(InputFilenamesFile); - if (!Buf) - exitWithErrorCode(Buf.getError(), InputFilenamesFile); + auto BufOrError = MemoryBuffer::getFileOrSTDIN(InputFilenamesFile); + if (!BufOrError) + exitWithErrorCode(BufOrError.getError(), InputFilenamesFile); + + std::unique_ptr<MemoryBuffer> Buffer = std::move(*BufOrError); + StringRef Data = Buffer->getBuffer(); - StringRef Data = Buf.get()->getBuffer(); SmallVector<StringRef, 8> Entries; Data.split(Entries, '\n', /*MaxSplit=*/-1, /*KeepEmpty=*/false); for (const StringRef &FileWeightEntry : Entries) { @@ -246,6 +249,8 @@ static void parseInputFilenamesFile(const StringRef &InputFilenamesFile, else WFV.emplace_back(parseWeightedFile(SanitizedEntry)); } + + return Buffer; } static int merge_main(int argc, const char *argv[]) { @@ -288,7 +293,7 @@ static int merge_main(int argc, const char *argv[]) { WeightedInputs.push_back(WeightedFile(Filename, 1)); for (StringRef WeightedFilename : WeightedInputFilenames) WeightedInputs.push_back(parseWeightedFile(WeightedFilename)); - parseInputFilenamesFile(InputFilenamesFile, WeightedInputs); + auto Buf = parseInputFilenamesFile(InputFilenamesFile, WeightedInputs); if (WeightedInputs.empty()) exitWithError("No input files specified. See " + |