Skip to content

Commit 38c41b1

Browse files
committed
[clangd] Fix use-after-free issues in TidyProvider.cpp
1 parent 0653698 commit 38c41b1

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

clang-tools-extra/clangd/TidyProvider.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class DotClangTidyCache : private FileCache {
4646
[this](std::optional<llvm::StringRef> Data) {
4747
Value.reset();
4848
if (Data && !Data->empty()) {
49-
tidy::DiagCallback Diagnostics = [](const llvm::SMDiagnostic &D) {
49+
auto Diagnostics = [](const llvm::SMDiagnostic &D) {
5050
switch (D.getKind()) {
5151
case llvm::SourceMgr::DK_Error:
5252
elog("tidy-config error at {0}:{1}:{2}: {3}", D.getFilename(),
@@ -159,12 +159,15 @@ TidyProviderRef provideEnvironment() {
159159
return Ret;
160160
}();
161161

162-
if (User)
163-
return
164-
[](tidy::ClangTidyOptions &Opts, llvm::StringRef) { Opts.User = User; };
162+
if (User) {
163+
static const auto Provider = [](tidy::ClangTidyOptions &Opts, llvm::StringRef) { Opts.User = User; };
164+
return Provider;
165+
}
165166
// FIXME: Once function_ref and unique_function operator= operators handle
166167
// null values, this can return null.
167-
return [](tidy::ClangTidyOptions &, llvm::StringRef) {};
168+
static const auto EmptyProvider = [](tidy::ClangTidyOptions &,
169+
llvm::StringRef) {};
170+
return EmptyProvider;
168171
}
169172

170173
TidyProviderRef provideDefaultChecks() {
@@ -178,10 +181,11 @@ TidyProviderRef provideDefaultChecks() {
178181
"bugprone-suspicious-missing-comma", "bugprone-unused-raii",
179182
"bugprone-unused-return-value", "misc-unused-using-decls",
180183
"misc-unused-alias-decls", "misc-definitions-in-headers");
181-
return [](tidy::ClangTidyOptions &Opts, llvm::StringRef) {
184+
static auto Provider = [](tidy::ClangTidyOptions &Opts, llvm::StringRef) {
182185
if (!Opts.Checks || Opts.Checks->empty())
183186
Opts.Checks = DefaultChecks;
184187
};
188+
return Provider;
185189
}
186190

187191
TidyProvider addTidyChecks(llvm::StringRef Checks,
@@ -252,7 +256,7 @@ TidyProvider disableUnusableChecks(llvm::ArrayRef<std::string> ExtraBadChecks) {
252256
}
253257

254258
TidyProviderRef provideClangdConfig() {
255-
return [](tidy::ClangTidyOptions &Opts, llvm::StringRef) {
259+
static const auto Provider = [](tidy::ClangTidyOptions &Opts, llvm::StringRef) {
256260
const auto &CurTidyConfig = Config::current().Diagnostics.ClangTidy;
257261
if (!CurTidyConfig.Checks.empty())
258262
mergeCheckList(Opts.Checks, CurTidyConfig.Checks);
@@ -262,6 +266,7 @@ TidyProviderRef provideClangdConfig() {
262266
tidy::ClangTidyOptions::ClangTidyValue(
263267
CheckOption.getValue(), 10000U));
264268
};
269+
return Provider;
265270
}
266271

267272
TidyProvider provideClangTidyFiles(ThreadsafeFS &TFS) {

0 commit comments

Comments
 (0)