| Index: core/fpdfapi/fpdf_parser/cpdf_data_avail.cpp
|
| diff --git a/core/fpdfapi/fpdf_parser/cpdf_data_avail.cpp b/core/fpdfapi/fpdf_parser/cpdf_data_avail.cpp
|
| index f210c49c71b9ac947cf9f668bd6c958075b4c979..e47d4244ac8a0ef3468a2c5b0b3e4091aef66c4e 100644
|
| --- a/core/fpdfapi/fpdf_parser/cpdf_data_avail.cpp
|
| +++ b/core/fpdfapi/fpdf_parser/cpdf_data_avail.cpp
|
| @@ -89,6 +89,7 @@ CPDF_DataAvail::CPDF_DataAvail(IPDF_DataAvail::FileAvail* pFileAvail,
|
| m_bSupportHintTable = bSupportHintTable;
|
| }
|
| CPDF_DataAvail::~CPDF_DataAvail() {
|
| + m_pHintTables.reset();
|
| if (m_pLinearized)
|
| m_pLinearized->Release();
|
|
|
| @@ -620,15 +621,14 @@ FX_BOOL CPDF_DataAvail::CheckPages(IPDF_DataAvail::DownloadHints* pHints) {
|
| }
|
|
|
| FX_BOOL CPDF_DataAvail::CheckHeader(IPDF_DataAvail::DownloadHints* pHints) {
|
| - uint32_t req_size = 1024;
|
| - if ((FX_FILESIZE)req_size > m_dwFileLen)
|
| - req_size = (uint32_t)m_dwFileLen;
|
| + ASSERT(m_dwFileLen >= 0);
|
| + const uint32_t kReqSize = std::min(static_cast<uint32_t>(m_dwFileLen), 1024U);
|
|
|
| - if (m_pFileAvail->IsDataAvail(0, req_size)) {
|
| + if (m_pFileAvail->IsDataAvail(0, kReqSize)) {
|
| uint8_t buffer[1024];
|
| - m_pFileRead->ReadBlock(buffer, 0, req_size);
|
| + m_pFileRead->ReadBlock(buffer, 0, kReqSize);
|
|
|
| - if (IsLinearizedFile(buffer, req_size)) {
|
| + if (IsLinearizedFile(buffer, kReqSize)) {
|
| m_docStatus = PDF_DATAAVAIL_FIRSTPAGE;
|
| } else {
|
| if (m_docStatus == PDF_DATAAVAIL_ERROR)
|
| @@ -638,7 +638,7 @@ FX_BOOL CPDF_DataAvail::CheckHeader(IPDF_DataAvail::DownloadHints* pHints) {
|
| return TRUE;
|
| }
|
|
|
| - pHints->AddSegment(0, req_size);
|
| + pHints->AddSegment(0, kReqSize);
|
| return FALSE;
|
| }
|
|
|
| @@ -813,25 +813,29 @@ CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt(
|
| }
|
|
|
| IPDF_DataAvail::DocLinearizationStatus CPDF_DataAvail::IsLinearizedPDF() {
|
| - uint32_t req_size = 1024;
|
| - if (!m_pFileAvail->IsDataAvail(0, req_size))
|
| + const uint32_t kReqSize = 1024;
|
| + if (!m_pFileAvail->IsDataAvail(0, kReqSize))
|
| return LinearizationUnknown;
|
|
|
| if (!m_pFileRead)
|
| return NotLinearized;
|
|
|
| FX_FILESIZE dwSize = m_pFileRead->GetSize();
|
| - if (dwSize < (FX_FILESIZE)req_size)
|
| + if (dwSize < (FX_FILESIZE)kReqSize)
|
| return LinearizationUnknown;
|
|
|
| uint8_t buffer[1024];
|
| - m_pFileRead->ReadBlock(buffer, 0, req_size);
|
| - if (IsLinearizedFile(buffer, req_size))
|
| + m_pFileRead->ReadBlock(buffer, 0, kReqSize);
|
| + if (IsLinearizedFile(buffer, kReqSize))
|
| return Linearized;
|
|
|
| return NotLinearized;
|
| }
|
| +
|
| FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, uint32_t dwLen) {
|
| + if (m_pLinearized)
|
| + return m_bLinearized;
|
| +
|
| ScopedFileStream file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE));
|
|
|
| int32_t offset = GetHeaderOffset(file.get());
|
| @@ -850,33 +854,28 @@ FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, uint32_t dwLen) {
|
| return FALSE;
|
|
|
| uint32_t objnum = FXSYS_atoui(wordObjNum.c_str());
|
| - if (m_pLinearized) {
|
| - m_pLinearized->Release();
|
| - m_pLinearized = nullptr;
|
| - }
|
| -
|
| m_pLinearized =
|
| ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum);
|
| if (!m_pLinearized)
|
| return FALSE;
|
|
|
| CPDF_Dictionary* pDict = m_pLinearized->GetDict();
|
| - if (pDict && pDict->GetObjectBy("Linearized")) {
|
| - CPDF_Object* pLen = pDict->GetObjectBy("L");
|
| - if (!pLen)
|
| - return FALSE;
|
| + if (!pDict || !pDict->GetObjectBy("Linearized"))
|
| + return FALSE;
|
|
|
| - if ((FX_FILESIZE)pLen->GetInteger() != m_pFileRead->GetSize())
|
| - return FALSE;
|
| + CPDF_Object* pLen = pDict->GetObjectBy("L");
|
| + if (!pLen)
|
| + return FALSE;
|
|
|
| - m_bLinearized = TRUE;
|
| + if ((FX_FILESIZE)pLen->GetInteger() != m_pFileRead->GetSize())
|
| + return FALSE;
|
|
|
| - if (CPDF_Number* pNo = ToNumber(pDict->GetObjectBy("P")))
|
| - m_dwFirstPageNo = pNo->GetInteger();
|
| + m_bLinearized = TRUE;
|
|
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| + if (CPDF_Number* pNo = ToNumber(pDict->GetObjectBy("P")))
|
| + m_dwFirstPageNo = pNo->GetInteger();
|
| +
|
| + return TRUE;
|
| }
|
|
|
| FX_BOOL CPDF_DataAvail::CheckEnd(IPDF_DataAvail::DownloadHints* pHints) {
|
|
|