| 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 f5ada7c6eb6c3c3d0712cb45dacbe7f4a48d79c2..949c3a4f6f54481d72caeecc6d5574b4da115d86 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| @@ -13,6 +13,7 @@
|
| #include "../../../include/fpdfapi/fpdf_module.h"
|
| #include "../../../include/fpdfapi/fpdf_page.h"
|
| #include "../../../include/fpdfapi/fpdf_parser.h"
|
| +#include "../../../include/fxcrt/fx_ext.h"
|
| #include "../../../include/fxcrt/fx_safe_types.h"
|
| #include "../fpdf_page/pageint.h"
|
| #include "parser_int.h"
|
| @@ -163,85 +164,83 @@ FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess,
|
| m_bXRefStream = FALSE;
|
| m_LastXRefOffset = 0;
|
| m_bOwnFileRead = bOwnFileRead;
|
| +
|
| int32_t offset = GetHeaderOffset(pFileAccess);
|
| if (offset == -1) {
|
| - if (bOwnFileRead && pFileAccess) {
|
| + if (bOwnFileRead && pFileAccess)
|
| pFileAccess->Release();
|
| - }
|
| return PDFPARSE_ERROR_FORMAT;
|
| }
|
| m_Syntax.InitParser(pFileAccess, offset);
|
| +
|
| uint8_t ch;
|
| - if (!m_Syntax.GetCharAt(5, ch)) {
|
| + if (!m_Syntax.GetCharAt(5, ch))
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| - if (ch >= '0' && ch <= '9') {
|
| - m_FileVersion = (ch - '0') * 10;
|
| - }
|
| - if (!m_Syntax.GetCharAt(7, ch)) {
|
| + if (std::isdigit(ch))
|
| + m_FileVersion = FXSYS_toDecimalDigit(ch) * 10;
|
| +
|
| + if (!m_Syntax.GetCharAt(7, ch))
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| - if (ch >= '0' && ch <= '9') {
|
| - m_FileVersion += ch - '0';
|
| - }
|
| - if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) {
|
| + if (std::isdigit(ch))
|
| + m_FileVersion += FXSYS_toDecimalDigit(ch);
|
| +
|
| + if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9)
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| +
|
| m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9);
|
| - if (!bReParse) {
|
| + if (!bReParse)
|
| m_pDocument = new CPDF_Document(this);
|
| - }
|
| +
|
| FX_BOOL bXRefRebuilt = FALSE;
|
| if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) {
|
| FX_FILESIZE startxref_offset = m_Syntax.SavePos();
|
| void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(),
|
| m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
|
| CompareFileSize);
|
| - if (pResult == NULL) {
|
| + if (!pResult)
|
| m_SortedOffset.Add(startxref_offset);
|
| - }
|
| +
|
| m_Syntax.GetKeyword();
|
| FX_BOOL bNumber;
|
| CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber);
|
| - if (!bNumber) {
|
| + if (!bNumber)
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| +
|
| m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
|
| if (!LoadAllCrossRefV4(m_LastXRefOffset) &&
|
| !LoadAllCrossRefV5(m_LastXRefOffset)) {
|
| - if (!RebuildCrossRef()) {
|
| + if (!RebuildCrossRef())
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| +
|
| bXRefRebuilt = TRUE;
|
| m_LastXRefOffset = 0;
|
| }
|
| } else {
|
| - if (!RebuildCrossRef()) {
|
| + if (!RebuildCrossRef())
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| +
|
| bXRefRebuilt = TRUE;
|
| }
|
| FX_DWORD dwRet = SetEncryptHandler();
|
| - if (dwRet != PDFPARSE_ERROR_SUCCESS) {
|
| + if (dwRet != PDFPARSE_ERROR_SUCCESS)
|
| return dwRet;
|
| - }
|
| +
|
| m_pDocument->LoadDoc();
|
| - if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {
|
| - if (bXRefRebuilt) {
|
| + if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) {
|
| + if (bXRefRebuilt)
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| +
|
| ReleaseEncryptHandler();
|
| - if (!RebuildCrossRef()) {
|
| + if (!RebuildCrossRef())
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| +
|
| dwRet = SetEncryptHandler();
|
| - if (dwRet != PDFPARSE_ERROR_SUCCESS) {
|
| + if (dwRet != PDFPARSE_ERROR_SUCCESS)
|
| return dwRet;
|
| - }
|
| +
|
| m_pDocument->LoadDoc();
|
| - if (m_pDocument->GetRoot() == NULL) {
|
| + if (!m_pDocument->GetRoot())
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| }
|
| FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
|
| sizeof(FX_FILESIZE), CompareFileSize);
|
| @@ -250,13 +249,12 @@ FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess,
|
| ReleaseEncryptHandler();
|
| RebuildCrossRef();
|
| RootObjNum = GetRootObjNum();
|
| - if (RootObjNum == 0) {
|
| + if (RootObjNum == 0)
|
| return PDFPARSE_ERROR_FORMAT;
|
| - }
|
| +
|
| dwRet = SetEncryptHandler();
|
| - if (dwRet != PDFPARSE_ERROR_SUCCESS) {
|
| + if (dwRet != PDFPARSE_ERROR_SUCCESS)
|
| return dwRet;
|
| - }
|
| }
|
| if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) {
|
| CPDF_Reference* pMetadata =
|
| @@ -460,9 +458,8 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos,
|
| int32_t offset = FXSYS_atoi(pEntry);
|
| if (offset == 0) {
|
| for (int32_t c = 0; c < 10; c++) {
|
| - if (pEntry[c] < '0' || pEntry[c] > '9') {
|
| + if (!std::isdigit(pEntry[c]))
|
| return FALSE;
|
| - }
|
| }
|
| }
|
| m_CrossRef.SetAtGrow(objnum, offset);
|
| @@ -561,9 +558,8 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos,
|
| FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);
|
| if (offset == 0) {
|
| for (int32_t c = 0; c < 10; c++) {
|
| - if (pEntry[c] < '0' || pEntry[c] > '9') {
|
| + if (!std::isdigit(pEntry[c]))
|
| return false;
|
| - }
|
| }
|
| }
|
| m_CrossRef.SetAtGrow(objnum, offset);
|
| @@ -631,28 +627,32 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| uint8_t byte = buffer[i];
|
| switch (status) {
|
| case 0:
|
| - if (PDFCharIsWhitespace(byte)) {
|
| + if (PDFCharIsWhitespace(byte))
|
| status = 1;
|
| - }
|
| - if (byte <= '9' && byte >= '0') {
|
| +
|
| + if (std::isdigit(byte)) {
|
| --i;
|
| status = 1;
|
| }
|
| +
|
| if (byte == '%') {
|
| inside_index = 0;
|
| status = 9;
|
| }
|
| +
|
| if (byte == '(') {
|
| status = 10;
|
| depth = 1;
|
| }
|
| +
|
| if (byte == '<') {
|
| inside_index = 1;
|
| status = 11;
|
| }
|
| - if (byte == '\\') {
|
| +
|
| + if (byte == '\\')
|
| status = 13;
|
| - }
|
| +
|
| if (byte == 't') {
|
| status = 7;
|
| inside_index = 1;
|
| @@ -661,10 +661,10 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| case 1:
|
| if (PDFCharIsWhitespace(byte)) {
|
| break;
|
| - } else if (byte <= '9' && byte >= '0') {
|
| + } else if (std::isdigit(byte)) {
|
| start_pos = pos + i;
|
| status = 2;
|
| - objnum = byte - '0';
|
| + objnum = FXSYS_toDecimalDigit(byte);
|
| } else if (byte == 't') {
|
| status = 7;
|
| inside_index = 1;
|
| @@ -677,8 +677,8 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| }
|
| break;
|
| case 2:
|
| - if (byte <= '9' && byte >= '0') {
|
| - objnum = objnum * 10 + byte - '0';
|
| + if (std::isdigit(byte)) {
|
| + objnum = objnum * 10 + FXSYS_toDecimalDigit(byte);
|
| break;
|
| } else if (PDFCharIsWhitespace(byte)) {
|
| status = 3;
|
| @@ -689,10 +689,10 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| }
|
| break;
|
| case 3:
|
| - if (byte <= '9' && byte >= '0') {
|
| + if (std::isdigit(byte)) {
|
| start_pos1 = pos + i;
|
| status = 4;
|
| - gennum = byte - '0';
|
| + gennum = FXSYS_toDecimalDigit(byte);
|
| } else if (PDFCharIsWhitespace(byte)) {
|
| break;
|
| } else if (byte == 't') {
|
| @@ -704,8 +704,8 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| }
|
| break;
|
| case 4:
|
| - if (byte <= '9' && byte >= '0') {
|
| - gennum = gennum * 10 + byte - '0';
|
| + if (std::isdigit(byte)) {
|
| + gennum = gennum * 10 + FXSYS_toDecimalDigit(byte);
|
| break;
|
| } else if (PDFCharIsWhitespace(byte)) {
|
| status = 5;
|
| @@ -720,9 +720,9 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| inside_index = 1;
|
| } else if (PDFCharIsWhitespace(byte)) {
|
| break;
|
| - } else if (byte <= '9' && byte >= '0') {
|
| + } else if (std::isdigit(byte)) {
|
| objnum = gennum;
|
| - gennum = byte - '0';
|
| + gennum = FXSYS_toDecimalDigit(byte);
|
| start_pos = start_pos1;
|
| start_pos1 = pos + i;
|
| status = 4;
|
| @@ -1863,7 +1863,7 @@ CFX_ByteString CPDF_SyntaxParser::ReadString() {
|
| break;
|
| case 1:
|
| if (ch >= '0' && ch <= '7') {
|
| - iEscCode = ch - '0';
|
| + iEscCode = FXSYS_toDecimalDigit(ch);
|
| status = 2;
|
| break;
|
| }
|
| @@ -1888,7 +1888,7 @@ CFX_ByteString CPDF_SyntaxParser::ReadString() {
|
| break;
|
| case 2:
|
| if (ch >= '0' && ch <= '7') {
|
| - iEscCode = iEscCode * 8 + ch - '0';
|
| + iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
|
| status = 3;
|
| } else {
|
| buf.AppendChar(iEscCode);
|
| @@ -1898,7 +1898,7 @@ CFX_ByteString CPDF_SyntaxParser::ReadString() {
|
| break;
|
| case 3:
|
| if (ch >= '0' && ch <= '7') {
|
| - iEscCode = iEscCode * 8 + ch - '0';
|
| + iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
|
| buf.AppendChar(iEscCode);
|
| status = 0;
|
| } else {
|
| @@ -1923,48 +1923,33 @@ CFX_ByteString CPDF_SyntaxParser::ReadString() {
|
| }
|
| CFX_ByteString CPDF_SyntaxParser::ReadHexString() {
|
| uint8_t ch;
|
| - if (!GetNextChar(ch)) {
|
| + if (!GetNextChar(ch))
|
| return CFX_ByteString();
|
| - }
|
| +
|
| CFX_BinaryBuf buf;
|
| - FX_BOOL bFirst = TRUE;
|
| + bool bFirst = true;
|
| uint8_t code = 0;
|
| while (1) {
|
| - if (ch == '>') {
|
| + if (ch == '>')
|
| break;
|
| - }
|
| - if (ch >= '0' && ch <= '9') {
|
| - if (bFirst) {
|
| - code = (ch - '0') * 16;
|
| - } else {
|
| - code += ch - '0';
|
| - buf.AppendByte((uint8_t)code);
|
| - }
|
| - bFirst = !bFirst;
|
| - } else if (ch >= 'A' && ch <= 'F') {
|
| - if (bFirst) {
|
| - code = (ch - 'A' + 10) * 16;
|
| - } else {
|
| - code += ch - 'A' + 10;
|
| - buf.AppendByte((uint8_t)code);
|
| - }
|
| - bFirst = !bFirst;
|
| - } else if (ch >= 'a' && ch <= 'f') {
|
| +
|
| + if (std::isxdigit(ch)) {
|
| + int val = FXSYS_toHexDigit(ch);
|
| if (bFirst) {
|
| - code = (ch - 'a' + 10) * 16;
|
| + code = val * 16;
|
| } else {
|
| - code += ch - 'a' + 10;
|
| + code += val;
|
| buf.AppendByte((uint8_t)code);
|
| }
|
| bFirst = !bFirst;
|
| }
|
| - if (!GetNextChar(ch)) {
|
| +
|
| + if (!GetNextChar(ch))
|
| break;
|
| - }
|
| }
|
| - if (!bFirst) {
|
| + if (!bFirst)
|
| buf.AppendByte((uint8_t)code);
|
| - }
|
| +
|
| return buf.GetByteString();
|
| }
|
| void CPDF_SyntaxParser::ToNextLine() {
|
|
|