summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_hint_tables.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfapi/parser/cpdf_hint_tables.cpp')
-rw-r--r--core/fpdfapi/parser/cpdf_hint_tables.cpp82
1 files changed, 25 insertions, 57 deletions
diff --git a/core/fpdfapi/parser/cpdf_hint_tables.cpp b/core/fpdfapi/parser/cpdf_hint_tables.cpp
index fc9a46d68a..f4f87d59e6 100644
--- a/core/fpdfapi/parser/cpdf_hint_tables.cpp
+++ b/core/fpdfapi/parser/cpdf_hint_tables.cpp
@@ -277,60 +277,38 @@ bool CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream,
return false;
}
- const uint32_t nFirstPageObjNum = m_pLinearized->GetFirstPageObjNum();
-
- uint32_t dwPrevObjLen = 0;
- uint32_t dwCurObjLen = 0;
FX_SAFE_UINT32 required_bits = dwSharedObjTotal;
required_bits *= dwDeltaGroupLen;
if (!CanReadFromBitStream(hStream, required_bits))
return false;
- for (uint32_t i = 0; i < dwSharedObjTotal; ++i) {
- dwPrevObjLen = dwCurObjLen;
- FX_SAFE_UINT32 safeObjLen = hStream->GetBits(dwDeltaGroupLen);
- safeObjLen += dwGroupLeastLen;
- if (!safeObjLen.IsValid())
- return false;
-
- dwCurObjLen = safeObjLen.ValueOrDie();
- if (i < m_nFirstPageSharedObjs) {
- m_dwSharedObjNumArray.push_back(nFirstPageObjNum + i);
- if (i == 0)
- m_szSharedObjOffsetArray.push_back(m_szFirstPageObjOffset);
- } else {
+ if (dwSharedObjTotal > 0) {
+ uint32_t dwLastSharedObj = dwSharedObjTotal - 1;
+ if (dwLastSharedObj > m_nFirstPageSharedObjs) {
FX_SAFE_UINT32 safeObjNum = dwFirstSharedObjNum;
- safeObjNum += i - m_nFirstPageSharedObjs;
+ safeObjNum += dwLastSharedObj - m_nFirstPageSharedObjs;
if (!safeObjNum.IsValid())
return false;
-
- m_dwSharedObjNumArray.push_back(safeObjNum.ValueOrDie());
- if (i == m_nFirstPageSharedObjs) {
- FX_SAFE_FILESIZE safeLoc = szFirstSharedObjLoc;
- if (!safeLoc.IsValid())
- return false;
-
- m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie());
- }
- }
-
- if (i != 0 && i != m_nFirstPageSharedObjs) {
- FX_SAFE_FILESIZE safeLoc = dwPrevObjLen;
- safeLoc += m_szSharedObjOffsetArray[i - 1];
- if (!safeLoc.IsValid())
- return false;
-
- m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie());
}
}
- if (dwSharedObjTotal > 0) {
- FX_SAFE_FILESIZE safeLoc = dwCurObjLen;
- safeLoc += m_szSharedObjOffsetArray[dwSharedObjTotal - 1];
- if (!safeLoc.IsValid())
+ m_SharedObjGroupInfos.resize(dwSharedObjTotal);
+ FX_SAFE_FILESIZE prev_shared_group_end_offset = m_szFirstPageObjOffset;
+ for (uint32_t i = 0; i < dwSharedObjTotal; ++i) {
+ if (i == m_nFirstPageSharedObjs)
+ prev_shared_group_end_offset = szFirstSharedObjLoc;
+
+ FX_SAFE_UINT32 safeObjLen = hStream->GetBits(dwDeltaGroupLen);
+ safeObjLen += dwGroupLeastLen;
+ if (!safeObjLen.IsValid())
return false;
- m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie());
+ m_SharedObjGroupInfos[i].m_dwLength = safeObjLen.ValueOrDie();
+ m_SharedObjGroupInfos[i].m_szOffset =
+ prev_shared_group_end_offset.ValueOrDie();
+ prev_shared_group_end_offset += m_SharedObjGroupInfos[i].m_dwLength;
+ if (!prev_shared_group_end_offset.IsValid())
+ return false;
}
hStream->ByteAlign();
@@ -362,7 +340,7 @@ CPDF_DataAvail::DocAvailStatus CPDF_HintTables::CheckPage(uint32_t index) {
if (index >= m_pLinearized->GetPageCount())
return CPDF_DataAvail::DataError;
- uint32_t dwLength = m_PageInfos[index].page_length();
+ const uint32_t dwLength = m_PageInfos[index].page_length();
if (!dwLength)
return CPDF_DataAvail::DataError;
@@ -372,27 +350,17 @@ CPDF_DataAvail::DocAvailStatus CPDF_HintTables::CheckPage(uint32_t index) {
}
// Download data of shared objects in the page.
- const uint32_t nFirstPageObjNum = m_pLinearized->GetFirstPageObjNum();
-
- uint32_t dwObjNum = 0;
for (const uint32_t dwIndex : m_PageInfos[index].Identifiers()) {
- if (dwIndex >= m_dwSharedObjNumArray.size())
+ if (dwIndex >= m_SharedObjGroupInfos.size())
continue;
+ const SharedObjGroupInfo& shared_group_info =
+ m_SharedObjGroupInfos[dwIndex];
- dwObjNum = m_dwSharedObjNumArray[dwIndex];
- if (dwObjNum >= static_cast<uint32_t>(nFirstPageObjNum) &&
- dwObjNum <
- static_cast<uint32_t>(nFirstPageObjNum) + m_nFirstPageSharedObjs) {
- continue;
- }
-
- dwLength = GetItemLength(dwIndex, m_szSharedObjOffsetArray);
- // If two objects have the same offset, it should be treated as an error.
- if (!dwLength)
+ if (!shared_group_info.m_szOffset || !shared_group_info.m_dwLength)
return CPDF_DataAvail::DataError;
if (!m_pValidator->CheckDataRangeAndRequestIfUnavailable(
- m_szSharedObjOffsetArray[dwIndex], dwLength)) {
+ shared_group_info.m_szOffset, shared_group_info.m_dwLength)) {
return CPDF_DataAvail::DataNotAvailable;
}
}