Commit 2bd9c443 by Corentin Wallez Committed by Commit Bot

preprocessor: add a limit to the number of token expanded

BUG=angleproject:1522 BUG=chromium:648074 Change-Id: Ibf0858aaeb81933dd221ac82a49160169b48a495 Reviewed-on: https://chromium-review.googlesource.com/387211Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
parent f607c60a
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
namespace pp namespace pp
{ {
namespace
{
const size_t kMaxContextTokens = 10000;
class TokenLexer : public Lexer class TokenLexer : public Lexer
{ {
public: public:
...@@ -46,8 +51,10 @@ class TokenLexer : public Lexer ...@@ -46,8 +51,10 @@ class TokenLexer : public Lexer
TokenVector::const_iterator mIter; TokenVector::const_iterator mIter;
}; };
} // anonymous namespace
MacroExpander::MacroExpander(Lexer *lexer, MacroSet *macroSet, Diagnostics *diagnostics) MacroExpander::MacroExpander(Lexer *lexer, MacroSet *macroSet, Diagnostics *diagnostics)
: mLexer(lexer), mMacroSet(macroSet), mDiagnostics(diagnostics) : mLexer(lexer), mMacroSet(macroSet), mDiagnostics(diagnostics), mTotalTokensInContexts(0)
{ {
} }
...@@ -114,6 +121,7 @@ void MacroExpander::getToken(Token *token) ...@@ -114,6 +121,7 @@ void MacroExpander::getToken(Token *token)
} }
else else
{ {
assert(mTotalTokensInContexts == 0);
mLexer->lex(token); mLexer->lex(token);
} }
} }
...@@ -164,6 +172,7 @@ bool MacroExpander::pushMacro(const Macro &macro, const Token &identifier) ...@@ -164,6 +172,7 @@ bool MacroExpander::pushMacro(const Macro &macro, const Token &identifier)
context->macro = &macro; context->macro = &macro;
context->replacements.swap(replacements); context->replacements.swap(replacements);
mContextStack.push_back(context); mContextStack.push_back(context);
mTotalTokensInContexts += context->replacements.size();
return true; return true;
} }
...@@ -179,6 +188,7 @@ void MacroExpander::popMacro() ...@@ -179,6 +188,7 @@ void MacroExpander::popMacro()
assert(context->macro->expansionCount > 0); assert(context->macro->expansionCount > 0);
context->macro->disabled = false; context->macro->disabled = false;
context->macro->expansionCount--; context->macro->expansionCount--;
mTotalTokensInContexts -= context->replacements.size();
delete context; delete context;
} }
...@@ -321,6 +331,7 @@ bool MacroExpander::collectMacroArgs(const Macro &macro, ...@@ -321,6 +331,7 @@ bool MacroExpander::collectMacroArgs(const Macro &macro,
// Pre-expand each argument before substitution. // Pre-expand each argument before substitution.
// This step expands each argument individually before they are // This step expands each argument individually before they are
// inserted into the macro body. // inserted into the macro body.
size_t numTokens = 0;
for (std::size_t i = 0; i < args->size(); ++i) for (std::size_t i = 0; i < args->size(); ++i)
{ {
MacroArg &arg = args->at(i); MacroArg &arg = args->at(i);
...@@ -333,6 +344,12 @@ bool MacroExpander::collectMacroArgs(const Macro &macro, ...@@ -333,6 +344,12 @@ bool MacroExpander::collectMacroArgs(const Macro &macro,
{ {
arg.push_back(token); arg.push_back(token);
expander.lex(&token); expander.lex(&token);
numTokens++;
if (numTokens + mTotalTokensInContexts > kMaxContextTokens)
{
mDiagnostics->report(Diagnostics::PP_OUT_OF_MEMORY, token.location, token.text);
return false;
}
} }
} }
return true; return true;
...@@ -344,6 +361,14 @@ void MacroExpander::replaceMacroParams(const Macro &macro, ...@@ -344,6 +361,14 @@ void MacroExpander::replaceMacroParams(const Macro &macro,
{ {
for (std::size_t i = 0; i < macro.replacements.size(); ++i) for (std::size_t i = 0; i < macro.replacements.size(); ++i)
{ {
if (!replacements->empty() &&
replacements->size() + mTotalTokensInContexts > kMaxContextTokens)
{
const Token &token = replacements->back();
mDiagnostics->report(Diagnostics::PP_OUT_OF_MEMORY, token.location, token.text);
return;
}
const Token &repl = macro.replacements[i]; const Token &repl = macro.replacements[i];
if (repl.type != Token::IDENTIFIER) if (repl.type != Token::IDENTIFIER)
{ {
......
...@@ -84,6 +84,7 @@ class MacroExpander : public Lexer ...@@ -84,6 +84,7 @@ class MacroExpander : public Lexer
std::unique_ptr<Token> mReserveToken; std::unique_ptr<Token> mReserveToken;
std::vector<MacroContext *> mContextStack; std::vector<MacroContext *> mContextStack;
size_t mTotalTokensInContexts;
}; };
} // namespace pp } // namespace pp
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment