From 4da1e7623c52572bc8677ac53b908f39543f13b1 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 10 May 2017 17:44:53 -0700 Subject: Limit XFA FormCalc program translation size. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BUG=chromium:665087,chromium:718492 Change-Id: I09e93b4167ab2c0b3b53641243aa0cbeb5b98c4f Reviewed-on: https://pdfium-review.googlesource.com/3114 Commit-Queue: Lei Zhang Reviewed-by: Nicolás Peña --- xfa/fxfa/fm2js/xfa_fmparse.cpp | 103 +++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 55 deletions(-) (limited to 'xfa/fxfa/fm2js/xfa_fmparse.cpp') diff --git a/xfa/fxfa/fm2js/xfa_fmparse.cpp b/xfa/fxfa/fm2js/xfa_fmparse.cpp index 298a2eb334..a7ba901c89 100644 --- a/xfa/fxfa/fm2js/xfa_fmparse.cpp +++ b/xfa/fxfa/fm2js/xfa_fmparse.cpp @@ -29,9 +29,9 @@ CXFA_FMParse::~CXFA_FMParse() {} void CXFA_FMParse::NextToken() { m_pToken = m_lexer->NextToken(); while (m_pToken->m_type == TOKreserver) { - if (m_lexer->HasError()) { + if (m_lexer->HasError()) break; - } + m_pToken = m_lexer->NextToken(); } } @@ -64,21 +64,10 @@ CXFA_FMParse::ParseTopExpression() { return expressions; } - if (m_pToken->m_type == TOKfunc) { - expr = ParseFunction(); - if (expr) { - expressions.push_back(std::move(expr)); - } else { - break; - } - } else { - expr = ParseExpression(); - if (expr) { - expressions.push_back(std::move(expr)); - } else { - break; - } - } + expr = m_pToken->m_type == TOKfunc ? ParseFunction() : ParseExpression(); + if (!expr) + break; + expressions.push_back(std::move(expr)); } return expressions; } @@ -108,20 +97,18 @@ std::unique_ptr CXFA_FMParse::ParseFunction() { if (m_pToken->m_type == TOKcomma) { NextToken(); continue; - } else if (m_pToken->m_type == TOKrparen) { + } + if (m_pToken->m_type == TOKrparen) NextToken(); - break; - } else { + else Check(TOKrparen); - break; - } } else { CFX_WideString ws_TempString(m_pToken->m_wstring); Error(m_pToken->m_uLinenum, kFMErrExpectedIdentifier, ws_TempString.c_str()); NextToken(); - break; } + break; } } Check(TOKdo); @@ -131,7 +118,7 @@ std::unique_ptr CXFA_FMParse::ParseFunction() { expressions = ParseTopExpression(); Check(TOKendfunc); } - if (!m_pErrorInfo->message.IsEmpty()) + if (HasError()) return nullptr; return pdfium::MakeUnique( @@ -205,7 +192,7 @@ std::unique_ptr CXFA_FMParse::ParseVarExpression() { NextToken(); expr = ParseExpExpression(); } - if (!m_pErrorInfo->message.IsEmpty()) + if (HasError()) return nullptr; return pdfium::MakeUnique(line, ident, std::move(expr)); @@ -233,7 +220,7 @@ std::unique_ptr CXFA_FMParse::ParseSimpleExpression() { std::unique_ptr CXFA_FMParse::ParseExpExpression() { uint32_t line = m_pToken->m_uLinenum; std::unique_ptr pExp1 = ParseSimpleExpression(); - if (!m_pErrorInfo->message.IsEmpty()) + if (HasError()) return nullptr; return pdfium::MakeUnique(line, std::move(pExp1)); @@ -522,7 +509,8 @@ CXFA_FMParse::ParsePrimaryExpression() { expr = pdfium::MakeUnique(line, wsIdentifier); } - } break; + break; + } case TOKif: expr = pdfium::MakeUnique( line, m_pToken->m_wstring); @@ -543,7 +531,7 @@ CXFA_FMParse::ParsePrimaryExpression() { break; } expr = ParsePostExpression(std::move(expr)); - if (!m_pErrorInfo->message.IsEmpty()) + if (HasError()) expr.reset(); return expr; } @@ -591,7 +579,8 @@ std::unique_ptr CXFA_FMParse::ParsePostExpression( } else { expr.reset(); } - } break; + break; + } case TOKdot: NextToken(); if (m_pToken->m_type == TOKidentifier) { @@ -645,7 +634,7 @@ std::unique_ptr CXFA_FMParse::ParsePostExpression( } } else if (m_pToken->m_type == TOKlbracket) { std::unique_ptr s = ParseIndexExpression(); - if (!(m_pErrorInfo->message.IsEmpty())) + if (HasError()) return nullptr; expr = pdfium::MakeUnique( @@ -673,9 +662,9 @@ std::unique_ptr CXFA_FMParse::ParsePostExpression( NextToken(); if (m_pToken->m_type == TOKlbracket) { std::unique_ptr s = ParseIndexExpression(); - if (!(m_pErrorInfo->message.IsEmpty())) { + if (HasError()) return nullptr; - } + expr = pdfium::MakeUnique( tempLine, std::move(expr), TOKdotdot, tempStr, std::move(s)); } else { @@ -693,41 +682,41 @@ std::unique_ptr CXFA_FMParse::ParsePostExpression( return expr; } break; - case TOKdotscream: + case TOKdotscream: { NextToken(); - if (m_pToken->m_type == TOKidentifier) { - CFX_WideStringC tempStr = m_pToken->m_wstring; - uint32_t tempLine = m_pToken->m_uLinenum; - NextToken(); - if (m_pToken->m_type == TOKlbracket) { - std::unique_ptr s = ParseIndexExpression(); - if (!(m_pErrorInfo->message.IsEmpty())) - return nullptr; - - expr = pdfium::MakeUnique( - tempLine, std::move(expr), TOKdotscream, tempStr, std::move(s)); - } else { - std::unique_ptr s = - pdfium::MakeUnique( - tempLine, ACCESSOR_NO_INDEX, nullptr, false); - expr = pdfium::MakeUnique( - line, std::move(expr), TOKdotscream, tempStr, std::move(s)); - continue; - } - } else { + if (m_pToken->m_type != TOKidentifier) { CFX_WideString ws_TempString(m_pToken->m_wstring); Error(m_pToken->m_uLinenum, kFMErrExpectedIdentifier, ws_TempString.c_str()); return expr; } + CFX_WideStringC tempStr = m_pToken->m_wstring; + uint32_t tempLine = m_pToken->m_uLinenum; + NextToken(); + if (m_pToken->m_type != TOKlbracket) { + std::unique_ptr s = + pdfium::MakeUnique( + tempLine, ACCESSOR_NO_INDEX, nullptr, false); + expr = pdfium::MakeUnique( + line, std::move(expr), TOKdotscream, tempStr, std::move(s)); + continue; + } + std::unique_ptr s = ParseIndexExpression(); + if (HasError()) + return nullptr; + + expr = pdfium::MakeUnique( + tempLine, std::move(expr), TOKdotscream, tempStr, std::move(s)); break; + } case TOKdotstar: { std::unique_ptr s = pdfium::MakeUnique(line, ACCESSOR_NO_INDEX, nullptr, false); expr = pdfium::MakeUnique( line, std::move(expr), TOKdotstar, L"*", std::move(s)); - } break; + break; + } default: return expr; } @@ -1028,8 +1017,12 @@ std::unique_ptr CXFA_FMParse::ParseDoExpression() { NextToken(); std::unique_ptr expr = ParseBlockExpression(); Check(TOKend); - if (!m_pErrorInfo->message.IsEmpty()) + if (HasError()) return nullptr; return pdfium::MakeUnique(line, std::move(expr)); } + +bool CXFA_FMParse::HasError() const { + return !m_pErrorInfo->message.IsEmpty(); +} -- cgit v1.2.3