aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/ASTUnit.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-07-27 14:52:07 +0000
committerDouglas Gregor <dgregor@apple.com>2010-07-27 14:52:07 +0000
commit28233428da1ebec20c893d6297ae3191318940dd (patch)
treee26d3ad614c47fe3fb5adcd0dfbf939706d35658 /lib/Frontend/ASTUnit.cpp
parent90176d1ef0c3a8c4e87184920cc2ec65e1394d0a (diff)
Fix use-after-free with precompiled preambles
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109505 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/ASTUnit.cpp')
-rw-r--r--lib/Frontend/ASTUnit.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp
index 0463db18dc..d67a6652da 100644
--- a/lib/Frontend/ASTUnit.cpp
+++ b/lib/Frontend/ASTUnit.cpp
@@ -39,7 +39,7 @@ using namespace clang;
ASTUnit::ASTUnit(bool _MainFileIsAST)
: CaptureDiagnostics(false), MainFileIsAST(_MainFileIsAST),
- ConcurrencyCheckValue(CheckUnlocked) { }
+ ConcurrencyCheckValue(CheckUnlocked), SavedMainFileBuffer(0) { }
ASTUnit::~ASTUnit() {
ConcurrencyCheckValue = CheckLocked;
@@ -60,6 +60,8 @@ ASTUnit::~ASTUnit() {
++FB)
delete FB->second;
}
+
+ delete SavedMainFileBuffer;
}
void ASTUnit::CleanTemporaryFiles() {
@@ -328,6 +330,9 @@ public:
/// \returns True if a failure occurred that causes the ASTUnit not to
/// contain any translation-unit information, false otherwise.
bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) {
+ delete SavedMainFileBuffer;
+ SavedMainFileBuffer = 0;
+
if (!Invocation.get())
return true;
@@ -395,6 +400,9 @@ bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) {
= PreambleEndsAtStartOfLine;
PreprocessorOpts.ImplicitPCHInclude = PreambleFile.str();
PreprocessorOpts.DisablePCHValidation = true;
+
+ // Keep track of the override buffer;
+ SavedMainFileBuffer = OverrideMainBuffer;
}
llvm::OwningPtr<TopLevelDeclTrackerAction> Act;
@@ -787,7 +795,6 @@ ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
if (!AST->Parse(OverrideMainBuffer))
return AST.take();
- delete OverrideMainBuffer;
return 0;
}
@@ -884,6 +891,5 @@ bool ASTUnit::Reparse(RemappedFile *RemappedFiles, unsigned NumRemappedFiles) {
// Parse the sources
bool Result = Parse(OverrideMainBuffer);
- delete OverrideMainBuffer;
return Result;
}