summaryrefslogtreecommitdiffstats
path: root/clang/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
commit96c042616e28ea64e2ccdb4109207dfd2c4fb1dd (patch)
treeef876ba4672fb1a382e3f315a9b93e6b7248d558 /clang/lib/Frontend/ASTUnit.cpp
parent195a609c378029a04cba431bf95a362b0fc108ef (diff)
downloadbcm5719-llvm-96c042616e28ea64e2ccdb4109207dfd2c4fb1dd.tar.gz
bcm5719-llvm-96c042616e28ea64e2ccdb4109207dfd2c4fb1dd.zip
Fix use-after-free with precompiled preambles
llvm-svn: 109505
Diffstat (limited to 'clang/lib/Frontend/ASTUnit.cpp')
-rw-r--r--clang/lib/Frontend/ASTUnit.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp
index 0463db18dc0..d67a6652dac 100644
--- a/clang/lib/Frontend/ASTUnit.cpp
+++ b/clang/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;
}
OpenPOWER on IntegriCloud