Chromium Code Reviews| 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 c6e48e74a2cc9ba20a8177a4ef6cf26fb4deac9a..2965348c66e11b3fbc4b2d7730d89dbba902f66c 100644 |
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
| @@ -136,6 +136,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 +349,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; |
| } |
| @@ -1234,32 +1241,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) { |
| @@ -1695,6 +1703,7 @@ CPDF_SyntaxParser::CPDF_SyntaxParser() { |
| m_dwWordPos = 0; |
| m_bFileStream = FALSE; |
| } |
| + |
| CPDF_SyntaxParser::~CPDF_SyntaxParser() { |
| FX_Free(m_pFileBuf); |
| } |
| @@ -1769,7 +1778,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; |
| @@ -1806,7 +1815,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 == '<') { |
| @@ -1828,7 +1837,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)) |
| @@ -3777,7 +3786,7 @@ 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; |
| @@ -3815,7 +3824,7 @@ FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString& token) { |
| return TRUE; |
| } |
| - if (m_WordSize < MAX_WORD_BUFFER) |
| + if (m_WordSize < sizeof(m_WordBuffer) - 1) |
|
Wei Li
2016/01/04 20:11:48
Should be "m_WordSize < sizeof(m_WordBuffer)"?
Lei Zhang
2016/01/05 01:27:53
That's because |CPDF_DataAvail::m_WordBuffer| is d
|
| m_WordBuffer[m_WordSize++] = ch; |
| } |
| } else if (ch == '<') { |
| @@ -3842,7 +3851,7 @@ FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString& token) { |
| } |
| while (1) { |
| - if (m_WordSize < MAX_WORD_BUFFER) |
| + if (m_WordSize < sizeof(m_WordBuffer) - 1) |
|
Wei Li
2016/01/04 20:11:48
Ditto
|
| m_WordBuffer[m_WordSize++] = ch; |
| if (!GetNextChar(ch)) |