| 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 2fa276290618a27f73fe08fba3ba01356fd3eba3..9d958521bd08826dc5460d9ce3641af534c5ba0c 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| @@ -14,6 +14,7 @@
|
| #include "core/include/fpdfapi/fpdf_module.h"
|
| #include "core/include/fpdfapi/fpdf_page.h"
|
| #include "core/include/fpdfapi/fpdf_parser.h"
|
| +#include "core/include/fxcrt/fx_ext.h"
|
| #include "core/include/fxcrt/fx_safe_types.h"
|
| #include "third_party/base/nonstd_unique_ptr.h"
|
| #include "third_party/base/stl_util.h"
|
| @@ -164,85 +165,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);
|
| @@ -251,13 +250,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 =
|
| @@ -461,9 +459,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);
|
| @@ -562,9 +559,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);
|
| @@ -632,28 +628,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;
|
| @@ -662,10 +662,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;
|
| @@ -678,8 +678,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;
|
| @@ -690,10 +690,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') {
|
| @@ -705,8 +705,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;
|
| @@ -721,9 +721,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;
|
| @@ -1858,7 +1858,7 @@ CFX_ByteString CPDF_SyntaxParser::ReadString() {
|
| break;
|
| case 1:
|
| if (ch >= '0' && ch <= '7') {
|
| - iEscCode = ch - '0';
|
| + iEscCode = FXSYS_toDecimalDigit(ch);
|
| status = 2;
|
| break;
|
| }
|
| @@ -1883,7 +1883,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);
|
| @@ -1893,7 +1893,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 {
|
| @@ -1918,48 +1918,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() {
|
|
|