[ASTUnit] Fix use-after-free bug in ASTUnit::getMainBufferWithPrecompiledPreamble().
With r197755 we started reading the contents of buffer file entries, but the buffers may point to ASTReader blobs that have been disposed. Fix this by having the CompilerInstance object keep a reference to the ASTReader as well as having the ASTContext keep reference to the ExternalASTSource. This was very difficult to construct a test case for. rdar://16149782 llvm-svn: 202346
This commit is contained in:
@@ -104,6 +104,13 @@ void CompilerInstance::setASTConsumer(ASTConsumer *Value) {
|
||||
void CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) {
|
||||
CompletionConsumer.reset(Value);
|
||||
}
|
||||
|
||||
IntrusiveRefCntPtr<ASTReader> CompilerInstance::getModuleManager() const {
|
||||
return ModuleManager;
|
||||
}
|
||||
void CompilerInstance::setModuleManager(IntrusiveRefCntPtr<ASTReader> Reader) {
|
||||
ModuleManager = Reader;
|
||||
}
|
||||
|
||||
// Diagnostics
|
||||
static void SetUpDiagnosticLog(DiagnosticOptions *DiagOpts,
|
||||
@@ -301,16 +308,16 @@ void CompilerInstance::createPCHExternalASTSource(StringRef Path,
|
||||
bool DisablePCHValidation,
|
||||
bool AllowPCHWithCompilerErrors,
|
||||
void *DeserializationListener){
|
||||
OwningPtr<ExternalASTSource> Source;
|
||||
IntrusiveRefCntPtr<ExternalASTSource> Source;
|
||||
bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0;
|
||||
Source.reset(createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot,
|
||||
Source = createPCHExternalASTSource(Path, getHeaderSearchOpts().Sysroot,
|
||||
DisablePCHValidation,
|
||||
AllowPCHWithCompilerErrors,
|
||||
getPreprocessor(), getASTContext(),
|
||||
DeserializationListener,
|
||||
Preamble,
|
||||
getFrontendOpts().UseGlobalModuleIndex));
|
||||
ModuleManager = static_cast<ASTReader*>(Source.get());
|
||||
getFrontendOpts().UseGlobalModuleIndex);
|
||||
ModuleManager = static_cast<ASTReader*>(Source.getPtr());
|
||||
getASTContext().setExternalSource(Source);
|
||||
}
|
||||
|
||||
@@ -1176,9 +1183,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc,
|
||||
getASTContext().setASTMutationListener(
|
||||
getASTConsumer().GetASTMutationListener());
|
||||
}
|
||||
OwningPtr<ExternalASTSource> Source;
|
||||
Source.reset(ModuleManager);
|
||||
getASTContext().setExternalSource(Source);
|
||||
getASTContext().setExternalSource(ModuleManager);
|
||||
if (hasSema())
|
||||
ModuleManager->InitializeSema(getSema());
|
||||
if (hasASTConsumer())
|
||||
|
||||
Reference in New Issue
Block a user