From bb327bcc1ebb8a4ede8a4ca924e93ad5656e7d8b Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 30 Apr 2019 19:43:35 +0000 Subject: [PATCH] Fix stack-use-after free after r359580 `Candidate` was a StringRef refering to a temporary string. Instead, create a local variable for the string and use a StringRef referring to that. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359604 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Option/OptTable.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/Option/OptTable.cpp b/lib/Option/OptTable.cpp index 8956c6830db..1585059c2fb 100644 --- a/lib/Option/OptTable.cpp +++ b/lib/Option/OptTable.cpp @@ -296,10 +296,11 @@ unsigned OptTable::findNearest(StringRef Option, std::string &NearestString, // "--help" over "-help". for (int P = 0; const char *const CandidatePrefix = CandidateInfo.Prefixes[P]; P++) { std::string NormalizedName = (LHS + Delimiter).str(); - StringRef Candidate = (CandidatePrefix + CandidateName).str(); + std::string Candidate = (CandidatePrefix + CandidateName).str(); + StringRef CandidateRef = Candidate; unsigned Distance = - Candidate.edit_distance(NormalizedName, /*AllowReplacements=*/true, - /*MaxEditDistance=*/BestDistance); + CandidateRef.edit_distance(NormalizedName, /*AllowReplacements=*/true, + /*MaxEditDistance=*/BestDistance); if (Distance < BestDistance) { BestDistance = Distance; NearestString = (Candidate + RHS).str(); -- 2.50.1