| 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) {
|
|
|