Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(649)

Unified Diff: xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp

Issue 1701363003: Fix some issues with CXFA_FMParse/CXFA_FMLexer infinite looping. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: delete more stuff Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp
diff --git a/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp b/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp
index 9a01267e2794e6babf64cce9bc74dfc41302bf4b..5ec82906df8797abb844a6d1c11942497ae6dcfe 100644
--- a/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp
+++ b/xfa/src/fxfa/src/fm2js/xfa_fmparse.cpp
@@ -5,33 +5,16 @@
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "xfa_fm2js.h"
-CXFA_FMParse::CXFA_FMParse() {
- m_pScript = 0;
- m_uLength = 0;
- m_pErrorInfo = 0;
- m_lexer = 0;
- m_pToken = 0;
-}
-CXFA_FMParse::~CXFA_FMParse() {
- if (m_lexer) {
- delete m_lexer;
- }
- m_lexer = 0;
- m_pErrorInfo = 0;
- m_pScript = 0;
- m_pToken = 0;
-}
+
+CXFA_FMParse::CXFA_FMParse() : m_pToken(nullptr), m_pErrorInfo(0) {}
+
int32_t CXFA_FMParse::Init(const CFX_WideStringC& wsFormcalc,
CXFA_FMErrorInfo* pErrorInfo) {
- m_pScript = wsFormcalc.GetPtr();
- m_uLength = wsFormcalc.GetLength();
m_pErrorInfo = pErrorInfo;
- m_lexer = new CXFA_FMLexer(wsFormcalc, m_pErrorInfo);
- if (m_lexer == 0) {
- return -1;
- }
+ m_lexer.reset(new CXFA_FMLexer(wsFormcalc, m_pErrorInfo));
return 0;
}
+
void CXFA_FMParse::NextToken() {
m_pToken = m_lexer->NextToken();
while (m_pToken->m_type == TOKreserver) {
@@ -41,6 +24,7 @@ void CXFA_FMParse::NextToken() {
m_pToken = m_lexer->NextToken();
}
}
+
void CXFA_FMParse::Check(XFA_FM_TOKEN op) {
if (m_pToken->m_type != op) {
CFX_WideString ws_TempString = m_pToken->m_wstring;
@@ -49,6 +33,7 @@ void CXFA_FMParse::Check(XFA_FM_TOKEN op) {
}
NextToken();
}
+
void CXFA_FMParse::Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...) {
m_pErrorInfo->linenum = lineNum;
const FX_WCHAR* lpMessageInfo = XFA_FM_ErrorMsg(msg);
@@ -57,6 +42,7 @@ void CXFA_FMParse::Error(FX_DWORD lineNum, XFA_FM_ERRMSG msg, ...) {
m_pErrorInfo->message.FormatV(lpMessageInfo, ap);
va_end(ap);
}
+
CFX_PtrArray* CXFA_FMParse::ParseTopExpression() {
CXFA_FMExpression* e = 0;
CFX_PtrArray* expression = new CFX_PtrArray();
@@ -76,6 +62,10 @@ CFX_PtrArray* CXFA_FMParse::ParseTopExpression() {
if (m_pToken->m_type == TOKelse) {
return expression;
}
+ if (m_pToken->m_type == TOKreserver) {
+ return expression;
+ }
+
if (m_pToken->m_type == TOKfunc) {
e = ParseFunction();
if (e) {
@@ -94,6 +84,7 @@ CFX_PtrArray* CXFA_FMParse::ParseTopExpression() {
}
return expression;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseFunction() {
CXFA_FMExpression* e = 0;
CFX_WideStringC ident;
@@ -172,6 +163,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseFunction() {
}
return e;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseExpression() {
CXFA_FMExpression* e = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -221,6 +213,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseExpression() {
}
return e;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseVarExpression() {
CXFA_FMExpression* e = 0;
CFX_WideStringC ident;
@@ -246,6 +239,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseVarExpression() {
}
return e;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseSimpleExpression() {
FX_DWORD line = m_pToken->m_uLinenum;
CXFA_FMSimpleExpression *pExp1 = 0, *pExp2 = 0;
@@ -262,6 +256,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseSimpleExpression() {
}
return pExp1;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseExpExpression() {
CXFA_FMExpression* e = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -275,6 +270,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseExpExpression() {
}
return e;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalOrExpression() {
CXFA_FMSimpleExpression *e1 = 0, *e2 = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -299,6 +295,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalOrExpression() {
}
return e1;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalAndExpression() {
CXFA_FMSimpleExpression *e1 = 0, *e2 = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -323,6 +320,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseLogicalAndExpression() {
}
return e1;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseEqualityExpression() {
CXFA_FMSimpleExpression *e1 = 0, *e2 = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -358,6 +356,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseEqualityExpression() {
}
return e1;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseRelationalExpression() {
CXFA_FMSimpleExpression *e1 = 0, *e2 = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -415,6 +414,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseRelationalExpression() {
}
return e1;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseAddtiveExpression() {
CXFA_FMSimpleExpression *e1 = 0, *e2 = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -448,6 +448,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseAddtiveExpression() {
}
return e1;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseMultiplicativeExpression() {
CXFA_FMSimpleExpression *e1 = 0, *e2 = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -481,6 +482,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseMultiplicativeExpression() {
}
return e1;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseUnaryExpression() {
CXFA_FMSimpleExpression* e = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -518,6 +520,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseUnaryExpression() {
}
return e;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParsePrimaryExpression() {
CXFA_FMSimpleExpression* e = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -569,6 +572,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParsePrimaryExpression() {
}
return e;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParsePostExpression(
CXFA_FMSimpleExpression* e) {
FX_DWORD line = m_pToken->m_uLinenum;
@@ -586,7 +590,8 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParsePostExpression(
}
if (m_pToken->m_type == TOKcomma) {
NextToken();
- } else if (m_pToken->m_type == TOKeof) {
+ } else if (m_pToken->m_type == TOKeof ||
+ m_pToken->m_type == TOKreserver) {
break;
}
}
@@ -641,7 +646,8 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParsePostExpression(
pArray->Add(exp);
if (m_pToken->m_type == TOKcomma) {
NextToken();
- } else if (m_pToken->m_type == TOKeof) {
+ } else if (m_pToken->m_type == TOKeof ||
+ m_pToken->m_type == TOKreserver) {
break;
}
}
@@ -791,6 +797,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParsePostExpression(
}
return e;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseIndexExpression() {
CXFA_FMSimpleExpression* pExp = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -831,6 +838,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseIndexExpression() {
}
return pExp;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseParenExpression() {
CXFA_FMSimpleExpression *pExp1 = 0, *pExp2 = 0;
FX_DWORD line = m_pToken->m_uLinenum;
@@ -853,6 +861,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseParenExpression() {
}
return pExp1;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseBlockExpression() {
FX_DWORD line = m_pToken->m_uLinenum;
CXFA_FMExpression* e = 0;
@@ -867,6 +876,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseBlockExpression() {
case TOKendfor:
case TOKend:
case TOKendfunc:
+ case TOKreserver:
break;
case TOKfunc:
e = ParseFunction();
@@ -900,6 +910,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseBlockExpression() {
}
return pExp;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseIfExpression() {
CXFA_FMSimpleExpression* pExpression = 0;
CXFA_FMExpression* pIfExpression = 0;
@@ -974,6 +985,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseIfExpression() {
}
return pExp;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseWhileExpression() {
CXFA_FMExpression* e = 0;
CXFA_FMSimpleExpression* pCondition = 0;
@@ -998,6 +1010,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseWhileExpression() {
}
return e;
}
+
CXFA_FMSimpleExpression* CXFA_FMParse::ParseSubassignmentInForExpression() {
CXFA_FMSimpleExpression* e = 0;
switch (m_pToken->m_type) {
@@ -1013,6 +1026,7 @@ CXFA_FMSimpleExpression* CXFA_FMParse::ParseSubassignmentInForExpression() {
}
return e;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseForExpression() {
CXFA_FMExpression* e = 0;
CFX_WideStringC wsVariant;
@@ -1075,6 +1089,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseForExpression() {
}
return e;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseForeachExpression() {
CXFA_FMExpression* e = 0;
CFX_WideStringC wsIdentifier;
@@ -1136,6 +1151,7 @@ CXFA_FMExpression* CXFA_FMParse::ParseForeachExpression() {
}
return e;
}
+
CXFA_FMExpression* CXFA_FMParse::ParseDoExpression() {
CXFA_FMExpression* e = 0;
FX_DWORD line = m_pToken->m_uLinenum;

Powered by Google App Engine
This is Rietveld 408576698