diff options
author | Chris Lattner <sabre@nondot.org> | 2007-07-22 01:16:55 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-07-22 01:16:55 +0000 |
commit | 9c724c48ea2479bac0965e53ac4c710ed9c71aea (patch) | |
tree | 93b0b21c244019bd5186e380e60e62a5e7a26f5d /clang/Lex/MacroExpander.cpp | |
parent | c850ad6ee122d3757d9dc1a67d4ddc9e9b219a42 (diff) | |
download | bcm5719-llvm-9c724c48ea2479bac0965e53ac4c710ed9c71aea.tar.gz bcm5719-llvm-9c724c48ea2479bac0965e53ac4c710ed9c71aea.zip |
Fix a really subtle bug in the macro expander caching code, where
redefinition of a macro could cause invalid memory to be deleted.
Found preprocessing 253.perlbmk.
llvm-svn: 40380
Diffstat (limited to 'clang/Lex/MacroExpander.cpp')
-rw-r--r-- | clang/Lex/MacroExpander.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/clang/Lex/MacroExpander.cpp b/clang/Lex/MacroExpander.cpp index fade8546572..57bdfccc110 100644 --- a/clang/Lex/MacroExpander.cpp +++ b/clang/Lex/MacroExpander.cpp @@ -245,6 +245,7 @@ void MacroExpander::Init(Token &Tok, MacroArgs *Actuals) { AtStartOfLine = Tok.isAtStartOfLine(); HasLeadingSpace = Tok.hasLeadingSpace(); MacroTokens = &*Macro->tokens_begin(); + OwnsMacroTokens = false; NumMacroTokens = Macro->tokens_end()-Macro->tokens_begin(); // If this is a function-like macro, expand the arguments and change @@ -270,6 +271,7 @@ void MacroExpander::Init(const Token *TokArray, unsigned NumToks) { Macro = 0; ActualArgs = 0; MacroTokens = TokArray; + OwnsMacroTokens = false; NumMacroTokens = NumToks; CurToken = 0; InstantiateLoc = SourceLocation(); @@ -288,8 +290,10 @@ void MacroExpander::Init(const Token *TokArray, unsigned NumToks) { void MacroExpander::destroy() { // If this was a function-like macro that actually uses its arguments, delete // the expanded tokens. - if (Macro && MacroTokens != &*Macro->tokens_begin()) + if (OwnsMacroTokens) { delete [] MacroTokens; + MacroTokens = 0; + } // MacroExpander owns its formal arguments. if (ActualArgs) ActualArgs->destroy(); @@ -455,6 +459,7 @@ void MacroExpander::ExpandFunctionArguments() { if (NumMacroTokens) memcpy(Res, &ResultToks[0], NumMacroTokens*sizeof(Token)); MacroTokens = Res; + OwnsMacroTokens = true; } } |