From e7fa09e4ae8ae50419010cac056637733e297c8c 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. llvm-svn: 359604 --- llvm/lib/Option/OptTable.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Option/OptTable.cpp b/llvm/lib/Option/OptTable.cpp index 8956c6830dbb..1585059c2fba 100644 --- a/llvm/lib/Option/OptTable.cpp +++ b/llvm/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();