mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-22 15:45:08 +00:00
Set RetainRemappedFileBuffers to true
Reported by David Welch in #350. This fixes double-free of llvm::MemoryBuffer when parsing fails.
This commit is contained in:
parent
4c871d9783
commit
3a364c868b
@ -1248,6 +1248,7 @@ Index(SemaManager *manager, WorkingFiles *wfiles, VFS *vfs,
|
||||
Clang->getDiagnostics(), Clang->getInvocation().TargetOpts));
|
||||
if (!Clang->hasTarget())
|
||||
return {};
|
||||
Clang->getPreprocessorOpts().RetainRemappedFileBuffers = true;
|
||||
#if LLVM_VERSION_MAJOR >= 9 // rC357037
|
||||
Clang->createFileManager(FS);
|
||||
#else
|
||||
@ -1302,8 +1303,6 @@ Index(SemaManager *manager, WorkingFiles *wfiles, VFS *vfs,
|
||||
<< (reason.empty() ? "" : ": " + reason);
|
||||
return {};
|
||||
}
|
||||
for (auto &Buf : Bufs)
|
||||
Buf.release();
|
||||
|
||||
std::vector<std::unique_ptr<IndexFile>> result;
|
||||
for (auto &it : param.UID2File) {
|
||||
|
@ -302,6 +302,7 @@ std::unique_ptr<CompilerInstance> BuildCompilerInstance(
|
||||
Clang->getDiagnostics(), Clang->getInvocation().TargetOpts));
|
||||
if (!Clang->hasTarget())
|
||||
return nullptr;
|
||||
Clang->getPreprocessorOpts().RetainRemappedFileBuffers = true;
|
||||
// Construct SourceManager with UserFilesAreVolatile: true because otherwise
|
||||
// RequiresNullTerminator: true may cause out-of-bounds read when a file is
|
||||
// mmap'ed but is saved concurrently.
|
||||
@ -490,7 +491,6 @@ void *CompletionMain(void *manager_) {
|
||||
Clang->setCodeCompletionConsumer(task->Consumer.release());
|
||||
if (!Parse(*Clang))
|
||||
continue;
|
||||
Buf.release();
|
||||
|
||||
task->on_complete(&Clang->getCodeCompletionConsumer());
|
||||
}
|
||||
@ -580,7 +580,6 @@ void *DiagnosticMain(void *manager_) {
|
||||
continue;
|
||||
if (!Parse(*Clang))
|
||||
continue;
|
||||
Buf.release();
|
||||
|
||||
auto Fill = [](const DiagBase &d, Diagnostic &ret) {
|
||||
ret.range = lsRange{{d.range.start.line, d.range.start.column},
|
||||
|
Loading…
Reference in New Issue
Block a user