| 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 026247c3aa606d41be252e678274626b60c7fda2..51c779fb86e78dfbfa4d3b270d2c4ed0a8db769e 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| @@ -61,13 +61,6 @@ int32_t GetDirectInteger(CPDF_Dictionary* pDict, const CFX_ByteStringC& key) {
|
| return pObj ? pObj->GetInteger() : 0;
|
| }
|
|
|
| -bool CheckDirectType(CPDF_Dictionary* pDict,
|
| - const CFX_ByteStringC& key,
|
| - int32_t iType) {
|
| - CPDF_Object* pObj = pDict->GetElement(key);
|
| - return !pObj || pObj->GetType() == iType;
|
| -}
|
| -
|
| FX_DWORD GetVarInt(const uint8_t* p, int32_t n) {
|
| FX_DWORD result = 0;
|
| for (int32_t i = 0; i < n; ++i)
|
| @@ -136,6 +129,12 @@ bool CPDF_Parser::IsValidObjectNumber(FX_DWORD objnum) const {
|
| void CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict) {
|
| m_pEncryptDict = pDict;
|
| }
|
| +
|
| +FX_FILESIZE CPDF_Parser::GetObjectPositionOrZero(FX_DWORD objnum) const {
|
| + auto it = m_ObjectInfo.find(objnum);
|
| + return it != m_ObjectInfo.end() ? it->second.pos : 0;
|
| +}
|
| +
|
| void CPDF_Parser::CloseParser(FX_BOOL bReParse) {
|
| m_bVersionUpdated = FALSE;
|
| if (!bReParse) {
|
| @@ -343,16 +342,17 @@ void CPDF_Parser::ReleaseEncryptHandler() {
|
| m_pSecurityHandler.reset();
|
| }
|
| }
|
| -FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) {
|
| +
|
| +FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) const {
|
| if (!IsValidObjectNumber(objnum))
|
| return 0;
|
|
|
| if (m_V5Type[objnum] == 1)
|
| - return m_ObjectInfo[objnum].pos;
|
| + return GetObjectPositionOrZero(objnum);
|
|
|
| if (m_V5Type[objnum] == 2) {
|
| - FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
|
| - return m_ObjectInfo[pos].pos;
|
| + FX_FILESIZE pos = GetObjectPositionOrZero(objnum);
|
| + return GetObjectPositionOrZero(pos);
|
| }
|
| return 0;
|
| }
|
| @@ -1238,32 +1238,33 @@ CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum) {
|
| m_ObjectStreamMap.SetAt((void*)(uintptr_t)objnum, pStreamAcc);
|
| return pStreamAcc;
|
| }
|
| -FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) {
|
| +
|
| +FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) const {
|
| if (!IsValidObjectNumber(objnum))
|
| return 0;
|
|
|
| - if (m_V5Type[objnum] == 2) {
|
| - objnum = m_ObjectInfo[objnum].pos;
|
| - }
|
| + if (m_V5Type[objnum] == 2)
|
| + objnum = GetObjectPositionOrZero(objnum);
|
| +
|
| if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
|
| - FX_FILESIZE offset = m_ObjectInfo[objnum].pos;
|
| - if (offset == 0) {
|
| + FX_FILESIZE offset = GetObjectPositionOrZero(objnum);
|
| + if (offset == 0)
|
| return 0;
|
| - }
|
| - void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(),
|
| - m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
|
| - CompareFileSize);
|
| - if (!pResult) {
|
| +
|
| + FX_FILESIZE* pResult = static_cast<FX_FILESIZE*>(FXSYS_bsearch(
|
| + &offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
|
| + sizeof(FX_FILESIZE), CompareFileSize));
|
| + if (!pResult)
|
| return 0;
|
| - }
|
| - if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() ==
|
| - m_SortedOffset.GetSize() - 1) {
|
| +
|
| + if (pResult - m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1)
|
| return 0;
|
| - }
|
| - return ((FX_FILESIZE*)pResult)[1] - offset;
|
| +
|
| + return pResult[1] - offset;
|
| }
|
| return 0;
|
| }
|
| +
|
| void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum,
|
| uint8_t*& pBuffer,
|
| FX_DWORD& size) {
|
| @@ -1699,6 +1700,7 @@ CPDF_SyntaxParser::CPDF_SyntaxParser() {
|
| m_dwWordPos = 0;
|
| m_bFileStream = FALSE;
|
| }
|
| +
|
| CPDF_SyntaxParser::~CPDF_SyntaxParser() {
|
| FX_Free(m_pFileBuf);
|
| }
|
| @@ -1773,7 +1775,7 @@ FX_BOOL CPDF_SyntaxParser::ReadBlock(uint8_t* pBuf, FX_DWORD size) {
|
| m_Pos += size;
|
| return TRUE;
|
| }
|
| -#define MAX_WORD_BUFFER 256
|
| +
|
| void CPDF_SyntaxParser::GetNextWord() {
|
| m_WordSize = 0;
|
| m_bIsNumber = TRUE;
|
| @@ -1810,7 +1812,7 @@ void CPDF_SyntaxParser::GetNextWord() {
|
| return;
|
| }
|
|
|
| - if (m_WordSize < MAX_WORD_BUFFER)
|
| + if (m_WordSize < sizeof(m_WordBuffer) - 1)
|
| m_WordBuffer[m_WordSize++] = ch;
|
| }
|
| } else if (ch == '<') {
|
| @@ -1832,7 +1834,7 @@ void CPDF_SyntaxParser::GetNextWord() {
|
| }
|
|
|
| while (1) {
|
| - if (m_WordSize < MAX_WORD_BUFFER)
|
| + if (m_WordSize < sizeof(m_WordBuffer) - 1)
|
| m_WordBuffer[m_WordSize++] = ch;
|
|
|
| if (!PDFCharIsNumeric(ch))
|
| @@ -2006,11 +2008,11 @@ void CPDF_SyntaxParser::ToNextWord() {
|
| CFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber) {
|
| GetNextWord();
|
| bIsNumber = m_bIsNumber;
|
| - return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize);
|
| + return CFX_ByteString(m_WordBuffer, m_WordSize);
|
| }
|
| CFX_ByteString CPDF_SyntaxParser::GetKeyword() {
|
| - GetNextWord();
|
| - return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize);
|
| + FX_BOOL dummy;
|
| + return GetNextWord(dummy);
|
| }
|
| CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList,
|
| FX_DWORD objnum,
|
| @@ -2488,7 +2490,7 @@ int32_t CPDF_SyntaxParser::GetDirectNum() {
|
| return 0;
|
| }
|
| m_WordBuffer[m_WordSize] = 0;
|
| - return FXSYS_atoi((const FX_CHAR*)m_WordBuffer);
|
| + return FXSYS_atoi(reinterpret_cast<const FX_CHAR*>(m_WordBuffer));
|
| }
|
|
|
| bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos,
|
| @@ -2819,10 +2821,6 @@ class CPDF_DataAvail final : public IPDF_DataAvail {
|
|
|
| CFX_ByteString m_WordBuf;
|
|
|
| - uint8_t m_WordBuffer[257];
|
| -
|
| - FX_DWORD m_WordSize;
|
| -
|
| uint8_t m_bufferData[512];
|
|
|
| CFX_FileSizeArray m_CrossOffset;
|
| @@ -2915,7 +2913,6 @@ CPDF_DataAvail::CPDF_DataAvail(IFX_FileAvail* pFileAvail,
|
| m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();
|
| }
|
| m_dwCurrentOffset = 0;
|
| - m_WordSize = 0;
|
| m_dwXRefOffset = 0;
|
| m_bufferOffset = 0;
|
| m_dwFirstPageNo = 0;
|
| @@ -3781,9 +3778,8 @@ int32_t CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints,
|
| inline void CPDF_DataAvail::SetStartOffset(FX_FILESIZE dwOffset) {
|
| m_Pos = dwOffset;
|
| }
|
| -#define MAX_WORD_BUFFER 256
|
| +
|
| FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString& token) {
|
| - m_WordSize = 0;
|
| uint8_t ch;
|
| if (!GetNextChar(ch))
|
| return FALSE;
|
| @@ -3805,8 +3801,10 @@ FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString& token) {
|
| }
|
| }
|
|
|
| + uint8_t buffer[256];
|
| + FX_DWORD index = 0;
|
| if (PDFCharIsDelimiter(ch)) {
|
| - m_WordBuffer[m_WordSize++] = ch;
|
| + buffer[index++] = ch;
|
| if (ch == '/') {
|
| while (1) {
|
| if (!GetNextChar(ch))
|
| @@ -3814,20 +3812,20 @@ FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString& token) {
|
|
|
| if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) {
|
| m_Pos--;
|
| - CFX_ByteString ret(m_WordBuffer, m_WordSize);
|
| + CFX_ByteString ret(buffer, index);
|
| token = ret;
|
| return TRUE;
|
| }
|
|
|
| - if (m_WordSize < MAX_WORD_BUFFER)
|
| - m_WordBuffer[m_WordSize++] = ch;
|
| + if (index < sizeof(buffer))
|
| + buffer[index++] = ch;
|
| }
|
| } else if (ch == '<') {
|
| if (!GetNextChar(ch))
|
| return FALSE;
|
|
|
| if (ch == '<')
|
| - m_WordBuffer[m_WordSize++] = ch;
|
| + buffer[index++] = ch;
|
| else
|
| m_Pos--;
|
| } else if (ch == '>') {
|
| @@ -3835,19 +3833,19 @@ FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString& token) {
|
| return FALSE;
|
|
|
| if (ch == '>')
|
| - m_WordBuffer[m_WordSize++] = ch;
|
| + buffer[index++] = ch;
|
| else
|
| m_Pos--;
|
| }
|
|
|
| - CFX_ByteString ret(m_WordBuffer, m_WordSize);
|
| + CFX_ByteString ret(buffer, index);
|
| token = ret;
|
| return TRUE;
|
| }
|
|
|
| while (1) {
|
| - if (m_WordSize < MAX_WORD_BUFFER)
|
| - m_WordBuffer[m_WordSize++] = ch;
|
| + if (index < sizeof(buffer))
|
| + buffer[index++] = ch;
|
|
|
| if (!GetNextChar(ch))
|
| return FALSE;
|
| @@ -3858,10 +3856,10 @@ FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString& token) {
|
| }
|
| }
|
|
|
| - CFX_ByteString ret(m_WordBuffer, m_WordSize);
|
| - token = ret;
|
| + token = CFX_ByteString(buffer, index);
|
| return TRUE;
|
| }
|
| +
|
| FX_BOOL CPDF_DataAvail::GetNextChar(uint8_t& ch) {
|
| FX_FILESIZE pos = m_Pos;
|
| if (pos >= m_dwFileLen) {
|
|
|