| Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp | 
| diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp | 
| index 5f1aa0b8e4f91985dffafa0f28761618b7381f1d..4dab123a968a2286dc2e46f4ea0158fcd4f5ed94 100644 | 
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp | 
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp | 
| @@ -216,8 +216,8 @@ FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, | 
| m_SortedOffset.Add(startxref_offset); | 
|  | 
| m_Syntax.GetKeyword(); | 
| -    FX_BOOL bNumber; | 
| -    CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber); | 
| +    bool bNumber; | 
| +    CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(&bNumber); | 
| if (!bNumber) | 
| return PDFPARSE_ERROR_FORMAT; | 
|  | 
| @@ -523,8 +523,8 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, | 
|  | 
| while (1) { | 
| FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 
| -    FX_BOOL bIsNumber; | 
| -    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); | 
| +    bool bIsNumber; | 
| +    CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (word.IsEmpty()) | 
| return false; | 
|  | 
| @@ -881,8 +881,9 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { | 
| FX_FILESIZE dwSavePos = m_Syntax.SavePos(); | 
| CFX_ByteString strWord = m_Syntax.GetKeyword(); | 
| if (!strWord.Compare("startxref")) { | 
| -                        FX_BOOL bNumber = FALSE; | 
| -                        CFX_ByteString bsOffset = m_Syntax.GetNextWord(bNumber); | 
| +                        bool bNumber; | 
| +                        CFX_ByteString bsOffset = | 
| +                            m_Syntax.GetNextWord(&bNumber); | 
| if (bNumber) { | 
| m_LastXRefOffset = FXSYS_atoi(bsOffset); | 
| } | 
| @@ -1317,8 +1318,8 @@ void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, | 
| } | 
| FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 
| m_Syntax.RestorePos(pos); | 
| -  FX_BOOL bIsNumber; | 
| -  CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); | 
| +  bool bIsNumber; | 
| +  CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (!bIsNumber) { | 
| m_Syntax.RestorePos(SavedPos); | 
| return; | 
| @@ -1328,7 +1329,7 @@ void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, | 
| m_Syntax.RestorePos(SavedPos); | 
| return; | 
| } | 
| -  word = m_Syntax.GetNextWord(bIsNumber); | 
| +  word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (!bIsNumber) { | 
| m_Syntax.RestorePos(SavedPos); | 
| return; | 
| @@ -1348,11 +1349,11 @@ void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, | 
| FX_BOOL bNextOffValid = FALSE; | 
| if (nextoff != pos) { | 
| m_Syntax.RestorePos(nextoff); | 
| -    word = m_Syntax.GetNextWord(bIsNumber); | 
| +    word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (word == "xref") { | 
| bNextOffValid = TRUE; | 
| } else if (bIsNumber) { | 
| -      word = m_Syntax.GetNextWord(bIsNumber); | 
| +      word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (bIsNumber && m_Syntax.GetKeyword() == "obj") { | 
| bNextOffValid = TRUE; | 
| } | 
| @@ -1383,8 +1384,8 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, | 
| PARSE_CONTEXT* pContext) { | 
| FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 
| m_Syntax.RestorePos(pos); | 
| -  FX_BOOL bIsNumber; | 
| -  CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); | 
| +  bool bIsNumber; | 
| +  CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (!bIsNumber) { | 
| m_Syntax.RestorePos(SavedPos); | 
| return NULL; | 
| @@ -1396,7 +1397,7 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, | 
| m_Syntax.RestorePos(SavedPos); | 
| return NULL; | 
| } | 
| -  word = m_Syntax.GetNextWord(bIsNumber); | 
| +  word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (!bIsNumber) { | 
| m_Syntax.RestorePos(SavedPos); | 
| return NULL; | 
| @@ -1430,8 +1431,8 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( | 
| FX_FILESIZE* pResultPos) { | 
| FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 
| m_Syntax.RestorePos(pos); | 
| -  FX_BOOL bIsNumber; | 
| -  CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); | 
| +  bool bIsNumber; | 
| +  CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (!bIsNumber) { | 
| m_Syntax.RestorePos(SavedPos); | 
| return NULL; | 
| @@ -1441,7 +1442,7 @@ CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( | 
| m_Syntax.RestorePos(SavedPos); | 
| return NULL; | 
| } | 
| -  word = m_Syntax.GetNextWord(bIsNumber); | 
| +  word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (!bIsNumber) { | 
| m_Syntax.RestorePos(SavedPos); | 
| return NULL; | 
| @@ -1503,13 +1504,13 @@ FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, | 
| m_Syntax.InitParser(pFileAccess, offset); | 
| m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9); | 
| FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 
| -  FX_BOOL bIsNumber; | 
| -  CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); | 
| +  bool bIsNumber; | 
| +  CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (!bIsNumber) { | 
| return FALSE; | 
| } | 
| FX_DWORD objnum = FXSYS_atoi(word); | 
| -  word = m_Syntax.GetNextWord(bIsNumber); | 
| +  word = m_Syntax.GetNextWord(&bIsNumber); | 
| if (!bIsNumber) { | 
| return FALSE; | 
| } | 
| @@ -1525,7 +1526,7 @@ FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, | 
|  | 
| CPDF_Dictionary* pDict = m_pLinearized->GetDict(); | 
| if (pDict && pDict->GetElement("Linearized")) { | 
| -    m_Syntax.GetNextWord(bIsNumber); | 
| +    m_Syntax.GetNextWord(nullptr); | 
|  | 
| CPDF_Object* pLen = pDict->GetElement("L"); | 
| if (!pLen) { | 
| @@ -1779,9 +1780,10 @@ FX_BOOL CPDF_SyntaxParser::ReadBlock(uint8_t* pBuf, FX_DWORD size) { | 
| return TRUE; | 
| } | 
|  | 
| -void CPDF_SyntaxParser::GetNextWord() { | 
| +void CPDF_SyntaxParser::GetNextWordInternal(bool* bIsNumber) { | 
| m_WordSize = 0; | 
| -  m_bIsNumber = TRUE; | 
| +  if (bIsNumber) | 
| +    *bIsNumber = true; | 
| uint8_t ch; | 
| if (!GetNextChar(ch)) { | 
| return; | 
| @@ -1803,7 +1805,8 @@ void CPDF_SyntaxParser::GetNextWord() { | 
| } | 
|  | 
| if (PDFCharIsDelimiter(ch)) { | 
| -    m_bIsNumber = FALSE; | 
| +    if (bIsNumber) | 
| +      *bIsNumber = false; | 
| m_WordBuffer[m_WordSize++] = ch; | 
| if (ch == '/') { | 
| while (1) { | 
| @@ -1841,7 +1844,8 @@ void CPDF_SyntaxParser::GetNextWord() { | 
| m_WordBuffer[m_WordSize++] = ch; | 
|  | 
| if (!PDFCharIsNumeric(ch)) | 
| -      m_bIsNumber = FALSE; | 
| +      if (bIsNumber) | 
| +        *bIsNumber = false; | 
| if (!GetNextChar(ch)) | 
| return; | 
|  | 
| @@ -1851,6 +1855,7 @@ void CPDF_SyntaxParser::GetNextWord() { | 
| } | 
| } | 
| } | 
| + | 
| CFX_ByteString CPDF_SyntaxParser::ReadString() { | 
| uint8_t ch; | 
| if (!GetNextChar(ch)) { | 
| @@ -2008,15 +2013,15 @@ void CPDF_SyntaxParser::ToNextWord() { | 
| m_Pos--; | 
| } | 
|  | 
| -CFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber) { | 
| -  GetNextWord(); | 
| -  bIsNumber = m_bIsNumber; | 
| -  return CFX_ByteString(m_WordBuffer, m_WordSize); | 
| +CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) { | 
| +  GetNextWordInternal(bIsNumber); | 
| +  return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize); | 
| } | 
| + | 
| CFX_ByteString CPDF_SyntaxParser::GetKeyword() { | 
| -  FX_BOOL dummy; | 
| -  return GetNextWord(dummy); | 
| +  return GetNextWord(nullptr); | 
| } | 
| + | 
| CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, | 
| FX_DWORD objnum, | 
| FX_DWORD gennum, | 
| @@ -2028,8 +2033,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, | 
| } | 
| FX_FILESIZE SavedPos = m_Pos; | 
| FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); | 
| -  FX_BOOL bIsNumber; | 
| -  CFX_ByteString word = GetNextWord(bIsNumber); | 
| +  bool bIsNumber; | 
| +  CFX_ByteString word = GetNextWord(&bIsNumber); | 
| if (word.GetLength() == 0) { | 
| if (bTypeOnly) | 
| return (CPDF_Object*)PDFOBJ_INVALID; | 
| @@ -2037,9 +2042,9 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, | 
| } | 
| if (bIsNumber) { | 
| FX_FILESIZE SavedPos = m_Pos; | 
| -    CFX_ByteString nextword = GetNextWord(bIsNumber); | 
| +    CFX_ByteString nextword = GetNextWord(&bIsNumber); | 
| if (bIsNumber) { | 
| -      CFX_ByteString nextword2 = GetNextWord(bIsNumber); | 
| +      CFX_ByteString nextword2 = GetNextWord(nullptr); | 
| if (nextword2 == "R") { | 
| FX_DWORD objnum = FXSYS_atoi(word); | 
| if (bTypeOnly) | 
| @@ -2108,8 +2113,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, | 
| std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 
| new CPDF_Dictionary); | 
| while (1) { | 
| -      FX_BOOL bIsNumber; | 
| -      CFX_ByteString key = GetNextWord(bIsNumber); | 
| +      CFX_ByteString key = GetNextWord(nullptr); | 
| if (key.IsEmpty()) | 
| return nullptr; | 
|  | 
| @@ -2160,8 +2164,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, | 
| } | 
| } | 
| FX_FILESIZE SavedPos = m_Pos; | 
| -    FX_BOOL bIsNumber; | 
| -    CFX_ByteString nextword = GetNextWord(bIsNumber); | 
| +    CFX_ByteString nextword = GetNextWord(nullptr); | 
| if (nextword != "stream") { | 
| m_Pos = SavedPos; | 
| return pDict.release(); | 
| @@ -2190,8 +2193,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( | 
| } | 
| FX_FILESIZE SavedPos = m_Pos; | 
| FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); | 
| -  FX_BOOL bIsNumber; | 
| -  CFX_ByteString word = GetNextWord(bIsNumber); | 
| +  bool bIsNumber; | 
| +  CFX_ByteString word = GetNextWord(&bIsNumber); | 
| if (word.GetLength() == 0) { | 
| if (bTypeOnly) | 
| return (CPDF_Object*)PDFOBJ_INVALID; | 
| @@ -2199,9 +2202,9 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( | 
| } | 
| if (bIsNumber) { | 
| FX_FILESIZE SavedPos = m_Pos; | 
| -    CFX_ByteString nextword = GetNextWord(bIsNumber); | 
| +    CFX_ByteString nextword = GetNextWord(&bIsNumber); | 
| if (bIsNumber) { | 
| -      CFX_ByteString nextword2 = GetNextWord(bIsNumber); | 
| +      CFX_ByteString nextword2 = GetNextWord(nullptr); | 
| if (nextword2 == "R") { | 
| if (bTypeOnly) | 
| return (CPDF_Object*)PDFOBJ_REFERENCE; | 
| @@ -2266,9 +2269,8 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( | 
| std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 
| new CPDF_Dictionary); | 
| while (1) { | 
| -      FX_BOOL bIsNumber; | 
| FX_FILESIZE SavedPos = m_Pos; | 
| -      CFX_ByteString key = GetNextWord(bIsNumber); | 
| +      CFX_ByteString key = GetNextWord(nullptr); | 
| if (key.IsEmpty()) | 
| return nullptr; | 
|  | 
| @@ -2303,8 +2305,7 @@ CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( | 
| } | 
| } | 
| FX_FILESIZE SavedPos = m_Pos; | 
| -    FX_BOOL bIsNumber; | 
| -    CFX_ByteString nextword = GetNextWord(bIsNumber); | 
| +    CFX_ByteString nextword = GetNextWord(nullptr); | 
| if (nextword != "stream") { | 
| m_Pos = SavedPos; | 
| return pDict.release(); | 
| @@ -2368,7 +2369,7 @@ CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, | 
| } | 
| m_Pos += ReadEOLMarkers(m_Pos); | 
| FXSYS_memset(m_WordBuffer, 0, kEndStreamStr.GetLength() + 1); | 
| -      GetNextWord(); | 
| +      GetNextWordInternal(nullptr); | 
| // Earlier version of PDF specification doesn't require EOL marker before | 
| // 'endstream' keyword. If keyword 'endstream' follows the bytes in | 
| // specified length, it signals the end of stream. | 
| @@ -2468,7 +2469,7 @@ CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, | 
| } | 
| streamStartPos = m_Pos; | 
| FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); | 
| -  GetNextWord(); | 
| +  GetNextWordInternal(nullptr); | 
| int numMarkers = ReadEOLMarkers(m_Pos); | 
| if (m_WordSize == kEndObjStr.GetLength() && numMarkers != 0 && | 
| FXSYS_memcmp(m_WordBuffer, kEndObjStr.GetPtr(), kEndObjStr.GetLength()) == | 
| @@ -2491,10 +2492,11 @@ void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, | 
| (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize)); | 
| } | 
| int32_t CPDF_SyntaxParser::GetDirectNum() { | 
| -  GetNextWord(); | 
| -  if (!m_bIsNumber) { | 
| +  bool bIsNumber; | 
| +  GetNextWordInternal(&bIsNumber); | 
| +  if (!bIsNumber) | 
| return 0; | 
| -  } | 
| + | 
| m_WordBuffer[m_WordSize] = 0; | 
| return FXSYS_atoi(reinterpret_cast<const FX_CHAR*>(m_WordBuffer)); | 
| } | 
| @@ -3623,23 +3625,23 @@ CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt( | 
| CPDF_IndirectObjects* pObjList) { | 
| FX_FILESIZE SavedPos = m_syntaxParser.SavePos(); | 
| m_syntaxParser.RestorePos(pos); | 
| -  FX_BOOL bIsNumber; | 
| -  CFX_ByteString word = m_syntaxParser.GetNextWord(bIsNumber); | 
| -  if (!bIsNumber) { | 
| -    return NULL; | 
| -  } | 
| +  bool bIsNumber; | 
| +  CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber); | 
| +  if (!bIsNumber) | 
| +    return nullptr; | 
| + | 
| FX_DWORD parser_objnum = FXSYS_atoi(word); | 
| -  if (objnum && parser_objnum != objnum) { | 
| -    return NULL; | 
| -  } | 
| -  word = m_syntaxParser.GetNextWord(bIsNumber); | 
| -  if (!bIsNumber) { | 
| -    return NULL; | 
| -  } | 
| +  if (objnum && parser_objnum != objnum) | 
| +    return nullptr; | 
| + | 
| +  word = m_syntaxParser.GetNextWord(&bIsNumber); | 
| +  if (!bIsNumber) | 
| +    return nullptr; | 
| + | 
| FX_DWORD gennum = FXSYS_atoi(word); | 
| if (m_syntaxParser.GetKeyword() != "obj") { | 
| m_syntaxParser.RestorePos(SavedPos); | 
| -    return NULL; | 
| +    return nullptr; | 
| } | 
| CPDF_Object* pObj = | 
| m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, nullptr, true); | 
| @@ -3675,11 +3677,11 @@ FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen) { | 
| m_dwHeaderOffset = offset; | 
| m_syntaxParser.InitParser(file.get(), offset); | 
| m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9); | 
| -  FX_BOOL bNumber = FALSE; | 
| -  CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber); | 
| -  if (!bNumber) { | 
| +  bool bNumber; | 
| +  CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(&bNumber); | 
| +  if (!bNumber) | 
| return FALSE; | 
| -  } | 
| + | 
| FX_DWORD objnum = FXSYS_atoi(wordObjNum); | 
| if (m_pLinearized) { | 
| m_pLinearized->Release(); | 
| @@ -3719,9 +3721,9 @@ FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints) { | 
| m_syntaxParser.InitParser(file.get(), 0); | 
| m_syntaxParser.RestorePos(dwSize - 1); | 
| if (m_syntaxParser.SearchWord("startxref", TRUE, FALSE, dwSize)) { | 
| -      FX_BOOL bNumber; | 
| -      m_syntaxParser.GetNextWord(bNumber); | 
| -      CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber); | 
| +      m_syntaxParser.GetNextWord(nullptr); | 
| +      bool bNumber; | 
| +      CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(&bNumber); | 
| if (!bNumber) { | 
| m_docStatus = PDF_DATAAVAIL_ERROR; | 
| return FALSE; | 
| @@ -3754,11 +3756,11 @@ int32_t CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, | 
| m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize); | 
| ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE)); | 
| m_parser.m_Syntax.InitParser(file.get(), 0); | 
| -    FX_BOOL bNumber = FALSE; | 
| -    CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber); | 
| -    if (!bNumber) { | 
| +    bool bNumber; | 
| +    CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(&bNumber); | 
| +    if (!bNumber) | 
| return -1; | 
| -    } | 
| + | 
| FX_DWORD objNum = FXSYS_atoi(objnum); | 
| CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL); | 
| if (!pObj) { | 
|  |