Author: Kadir Cetinkaya Date: 2021-03-25T18:26:17+01:00 New Revision: 7f5abb63733238b89cf5d47116b2af68cda2af4e
URL: https://github.com/llvm/llvm-project/commit/7f5abb63733238b89cf5d47116b2af68cda2af4e DIFF: https://github.com/llvm/llvm-project/commit/7f5abb63733238b89cf5d47116b2af68cda2af4e.diff LOG: [clangd] Fix a use-after-free Clangd was storing reference to a possibly-dead string in compiled config. This patch fixes the issue by copying suppression strings from fragments into compiled Config. Fixes https://github.com/clangd/clangd/issues/724. Differential Revision: https://reviews.llvm.org/D99326 Added: Modified: clang-tools-extra/clangd/ConfigCompile.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/ConfigCompile.cpp b/clang-tools-extra/clangd/ConfigCompile.cpp index 9aed3c4679f5e..8f402ae061535 100644 --- a/clang-tools-extra/clangd/ConfigCompile.cpp +++ b/clang-tools-extra/clangd/ConfigCompile.cpp @@ -371,7 +371,7 @@ struct FragmentCompiler { } void compile(Fragment::DiagnosticsBlock &&F) { - std::vector<llvm::StringRef> Normalized; + std::vector<std::string> Normalized; for (const auto &Suppressed : F.Suppress) { if (*Suppressed == "*") { Out.Apply.push_back([&](const Params &, Config &C) { @@ -380,15 +380,16 @@ struct FragmentCompiler { }); return; } - Normalized.push_back(normalizeSuppressedCode(*Suppressed)); + Normalized.push_back(normalizeSuppressedCode(*Suppressed).str()); } if (!Normalized.empty()) - Out.Apply.push_back([Normalized](const Params &, Config &C) { - if (C.Diagnostics.SuppressAll) - return; - for (llvm::StringRef N : Normalized) - C.Diagnostics.Suppress.insert(N); - }); + Out.Apply.push_back( + [Normalized(std::move(Normalized))](const Params &, Config &C) { + if (C.Diagnostics.SuppressAll) + return; + for (llvm::StringRef N : Normalized) + C.Diagnostics.Suppress.insert(N); + }); compile(std::move(F.ClangTidy)); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits