OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fpdfapi/fpdf_parser/cpdf_hint_tables.h" | 7 #include "core/fpdfapi/fpdf_parser/cpdf_hint_tables.h" |
8 | 8 |
9 #include "core/fpdfapi/fpdf_parser/cpdf_data_avail.h" | 9 #include "core/fpdfapi/fpdf_parser/cpdf_data_avail.h" |
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
11 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" | 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
12 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h" | 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h" |
13 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h" | 13 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h" |
14 #include "core/fxcrt/include/fx_safe_types.h" | 14 #include "core/fxcrt/include/fx_safe_types.h" |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 bool CanReadFromBitStream(const CFX_BitStream* hStream, | 18 bool CanReadFromBitStream(const CFX_BitStream* hStream, |
19 const FX_SAFE_DWORD& num_bits) { | 19 const FX_SAFE_UINT32& num_bits) { |
20 return num_bits.IsValid() && | 20 return num_bits.IsValid() && |
21 hStream->BitsRemaining() >= num_bits.ValueOrDie(); | 21 hStream->BitsRemaining() >= num_bits.ValueOrDie(); |
22 } | 22 } |
23 | 23 |
24 } // namespace | 24 } // namespace |
25 | 25 |
26 CPDF_HintTables::~CPDF_HintTables() { | 26 CPDF_HintTables::~CPDF_HintTables() { |
27 m_dwDeltaNObjsArray.RemoveAll(); | 27 m_dwDeltaNObjsArray.RemoveAll(); |
28 m_dwNSharedObjsArray.RemoveAll(); | 28 m_dwNSharedObjsArray.RemoveAll(); |
29 m_dwSharedObjNumArray.RemoveAll(); | 29 m_dwSharedObjNumArray.RemoveAll(); |
(...skipping 23 matching lines...) Expand all Loading... |
53 const uint32_t kHeaderSize = 288; | 53 const uint32_t kHeaderSize = 288; |
54 if (hStream->BitsRemaining() < kHeaderSize) | 54 if (hStream->BitsRemaining() < kHeaderSize) |
55 return FALSE; | 55 return FALSE; |
56 | 56 |
57 // Item 1: The least number of objects in a page. | 57 // Item 1: The least number of objects in a page. |
58 uint32_t dwObjLeastNum = hStream->GetBits(32); | 58 uint32_t dwObjLeastNum = hStream->GetBits(32); |
59 | 59 |
60 // Item 2: The location of the first page's page object. | 60 // Item 2: The location of the first page's page object. |
61 uint32_t dwFirstObjLoc = hStream->GetBits(32); | 61 uint32_t dwFirstObjLoc = hStream->GetBits(32); |
62 if (dwFirstObjLoc > static_cast<uint32_t>(nStreamOffset)) { | 62 if (dwFirstObjLoc > static_cast<uint32_t>(nStreamOffset)) { |
63 FX_SAFE_DWORD safeLoc = pdfium::base::checked_cast<uint32_t>(nStreamLen); | 63 FX_SAFE_UINT32 safeLoc = pdfium::base::checked_cast<uint32_t>(nStreamLen); |
64 safeLoc += dwFirstObjLoc; | 64 safeLoc += dwFirstObjLoc; |
65 if (!safeLoc.IsValid()) | 65 if (!safeLoc.IsValid()) |
66 return FALSE; | 66 return FALSE; |
67 m_szFirstPageObjOffset = | 67 m_szFirstPageObjOffset = |
68 pdfium::base::checked_cast<FX_FILESIZE>(safeLoc.ValueOrDie()); | 68 pdfium::base::checked_cast<FX_FILESIZE>(safeLoc.ValueOrDie()); |
69 } else { | 69 } else { |
70 m_szFirstPageObjOffset = | 70 m_szFirstPageObjOffset = |
71 pdfium::base::checked_cast<FX_FILESIZE>(dwFirstObjLoc); | 71 pdfium::base::checked_cast<FX_FILESIZE>(dwFirstObjLoc); |
72 } | 72 } |
73 | 73 |
(...skipping 26 matching lines...) Expand all Loading... |
100 uint32_t dwSharedNumeratorBits = hStream->GetBits(16); | 100 uint32_t dwSharedNumeratorBits = hStream->GetBits(16); |
101 | 101 |
102 // Item 13: Skip Item 13 which has 16 bits. | 102 // Item 13: Skip Item 13 which has 16 bits. |
103 hStream->SkipBits(16); | 103 hStream->SkipBits(16); |
104 | 104 |
105 CPDF_Object* pPageNum = m_pLinearizedDict->GetDirectObjectBy("N"); | 105 CPDF_Object* pPageNum = m_pLinearizedDict->GetDirectObjectBy("N"); |
106 int nPages = pPageNum ? pPageNum->GetInteger() : 0; | 106 int nPages = pPageNum ? pPageNum->GetInteger() : 0; |
107 if (nPages < 1) | 107 if (nPages < 1) |
108 return FALSE; | 108 return FALSE; |
109 | 109 |
110 FX_SAFE_DWORD required_bits = dwDeltaObjectsBits; | 110 FX_SAFE_UINT32 required_bits = dwDeltaObjectsBits; |
111 required_bits *= pdfium::base::checked_cast<uint32_t>(nPages); | 111 required_bits *= pdfium::base::checked_cast<uint32_t>(nPages); |
112 if (!CanReadFromBitStream(hStream, required_bits)) | 112 if (!CanReadFromBitStream(hStream, required_bits)) |
113 return FALSE; | 113 return FALSE; |
114 | 114 |
115 for (int i = 0; i < nPages; ++i) { | 115 for (int i = 0; i < nPages; ++i) { |
116 FX_SAFE_DWORD safeDeltaObj = hStream->GetBits(dwDeltaObjectsBits); | 116 FX_SAFE_UINT32 safeDeltaObj = hStream->GetBits(dwDeltaObjectsBits); |
117 safeDeltaObj += dwObjLeastNum; | 117 safeDeltaObj += dwObjLeastNum; |
118 if (!safeDeltaObj.IsValid()) | 118 if (!safeDeltaObj.IsValid()) |
119 return FALSE; | 119 return FALSE; |
120 m_dwDeltaNObjsArray.Add(safeDeltaObj.ValueOrDie()); | 120 m_dwDeltaNObjsArray.Add(safeDeltaObj.ValueOrDie()); |
121 } | 121 } |
122 hStream->ByteAlign(); | 122 hStream->ByteAlign(); |
123 | 123 |
124 required_bits = dwDeltaPageLenBits; | 124 required_bits = dwDeltaPageLenBits; |
125 required_bits *= pdfium::base::checked_cast<uint32_t>(nPages); | 125 required_bits *= pdfium::base::checked_cast<uint32_t>(nPages); |
126 if (!CanReadFromBitStream(hStream, required_bits)) | 126 if (!CanReadFromBitStream(hStream, required_bits)) |
127 return FALSE; | 127 return FALSE; |
128 | 128 |
129 CFX_ArrayTemplate<uint32_t> dwPageLenArray; | 129 CFX_ArrayTemplate<uint32_t> dwPageLenArray; |
130 for (int i = 0; i < nPages; ++i) { | 130 for (int i = 0; i < nPages; ++i) { |
131 FX_SAFE_DWORD safePageLen = hStream->GetBits(dwDeltaPageLenBits); | 131 FX_SAFE_UINT32 safePageLen = hStream->GetBits(dwDeltaPageLenBits); |
132 safePageLen += dwPageLeastLen; | 132 safePageLen += dwPageLeastLen; |
133 if (!safePageLen.IsValid()) | 133 if (!safePageLen.IsValid()) |
134 return FALSE; | 134 return FALSE; |
135 dwPageLenArray.Add(safePageLen.ValueOrDie()); | 135 dwPageLenArray.Add(safePageLen.ValueOrDie()); |
136 } | 136 } |
137 | 137 |
138 CPDF_Object* pOffsetE = m_pLinearizedDict->GetDirectObjectBy("E"); | 138 CPDF_Object* pOffsetE = m_pLinearizedDict->GetDirectObjectBy("E"); |
139 int nOffsetE = pOffsetE ? pOffsetE->GetInteger() : -1; | 139 int nOffsetE = pOffsetE ? pOffsetE->GetInteger() : -1; |
140 if (nOffsetE < 0) | 140 if (nOffsetE < 0) |
141 return FALSE; | 141 return FALSE; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 required_bits *= m_dwNSharedObjsArray[i]; | 184 required_bits *= m_dwNSharedObjsArray[i]; |
185 if (!CanReadFromBitStream(hStream, required_bits)) | 185 if (!CanReadFromBitStream(hStream, required_bits)) |
186 return FALSE; | 186 return FALSE; |
187 | 187 |
188 for (uint32_t j = 0; j < m_dwNSharedObjsArray[i]; j++) | 188 for (uint32_t j = 0; j < m_dwNSharedObjsArray[i]; j++) |
189 m_dwIdentifierArray.Add(hStream->GetBits(dwSharedIdBits)); | 189 m_dwIdentifierArray.Add(hStream->GetBits(dwSharedIdBits)); |
190 } | 190 } |
191 hStream->ByteAlign(); | 191 hStream->ByteAlign(); |
192 | 192 |
193 for (int i = 0; i < nPages; i++) { | 193 for (int i = 0; i < nPages; i++) { |
194 FX_SAFE_DWORD safeSize = m_dwNSharedObjsArray[i]; | 194 FX_SAFE_UINT32 safeSize = m_dwNSharedObjsArray[i]; |
195 safeSize *= dwSharedNumeratorBits; | 195 safeSize *= dwSharedNumeratorBits; |
196 if (!CanReadFromBitStream(hStream, safeSize)) | 196 if (!CanReadFromBitStream(hStream, safeSize)) |
197 return FALSE; | 197 return FALSE; |
198 | 198 |
199 hStream->SkipBits(safeSize.ValueOrDie()); | 199 hStream->SkipBits(safeSize.ValueOrDie()); |
200 } | 200 } |
201 hStream->ByteAlign(); | 201 hStream->ByteAlign(); |
202 | 202 |
203 FX_SAFE_DWORD safeTotalPageLen = pdfium::base::checked_cast<uint32_t>(nPages); | 203 FX_SAFE_UINT32 safeTotalPageLen = |
| 204 pdfium::base::checked_cast<uint32_t>(nPages); |
204 safeTotalPageLen *= dwDeltaPageLenBits; | 205 safeTotalPageLen *= dwDeltaPageLenBits; |
205 if (!CanReadFromBitStream(hStream, safeTotalPageLen)) | 206 if (!CanReadFromBitStream(hStream, safeTotalPageLen)) |
206 return FALSE; | 207 return FALSE; |
207 | 208 |
208 hStream->SkipBits(safeTotalPageLen.ValueOrDie()); | 209 hStream->SkipBits(safeTotalPageLen.ValueOrDie()); |
209 hStream->ByteAlign(); | 210 hStream->ByteAlign(); |
210 return TRUE; | 211 return TRUE; |
211 } | 212 } |
212 | 213 |
213 FX_BOOL CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream, | 214 FX_BOOL CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream, |
214 uint32_t offset) { | 215 uint32_t offset) { |
215 if (!hStream || hStream->IsEOF()) | 216 if (!hStream || hStream->IsEOF()) |
216 return FALSE; | 217 return FALSE; |
217 | 218 |
218 int nStreamOffset = ReadPrimaryHintStreamOffset(); | 219 int nStreamOffset = ReadPrimaryHintStreamOffset(); |
219 int nStreamLen = ReadPrimaryHintStreamLength(); | 220 int nStreamLen = ReadPrimaryHintStreamLength(); |
220 if (nStreamOffset < 0 || nStreamLen < 1) | 221 if (nStreamOffset < 0 || nStreamLen < 1) |
221 return FALSE; | 222 return FALSE; |
222 | 223 |
223 FX_SAFE_DWORD bit_offset = offset; | 224 FX_SAFE_UINT32 bit_offset = offset; |
224 bit_offset *= 8; | 225 bit_offset *= 8; |
225 if (!bit_offset.IsValid() || hStream->GetPos() > bit_offset.ValueOrDie()) | 226 if (!bit_offset.IsValid() || hStream->GetPos() > bit_offset.ValueOrDie()) |
226 return FALSE; | 227 return FALSE; |
227 hStream->SkipBits(bit_offset.ValueOrDie() - hStream->GetPos()); | 228 hStream->SkipBits(bit_offset.ValueOrDie() - hStream->GetPos()); |
228 | 229 |
229 const uint32_t kHeaderSize = 192; | 230 const uint32_t kHeaderSize = 192; |
230 if (hStream->BitsRemaining() < kHeaderSize) | 231 if (hStream->BitsRemaining() < kHeaderSize) |
231 return FALSE; | 232 return FALSE; |
232 | 233 |
233 // Item 1: The object number of the first object in the shared objects | 234 // Item 1: The object number of the first object in the shared objects |
(...skipping 22 matching lines...) Expand all Loading... |
256 // Item 7: The number of bits needed to represent the difference between the | 257 // Item 7: The number of bits needed to represent the difference between the |
257 // greatest and least length of a shared object group, in bytes. | 258 // greatest and least length of a shared object group, in bytes. |
258 uint32_t dwDeltaGroupLen = hStream->GetBits(16); | 259 uint32_t dwDeltaGroupLen = hStream->GetBits(16); |
259 CPDF_Object* pFirstPageObj = m_pLinearizedDict->GetDirectObjectBy("O"); | 260 CPDF_Object* pFirstPageObj = m_pLinearizedDict->GetDirectObjectBy("O"); |
260 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1; | 261 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1; |
261 if (nFirstPageObjNum < 0) | 262 if (nFirstPageObjNum < 0) |
262 return FALSE; | 263 return FALSE; |
263 | 264 |
264 uint32_t dwPrevObjLen = 0; | 265 uint32_t dwPrevObjLen = 0; |
265 uint32_t dwCurObjLen = 0; | 266 uint32_t dwCurObjLen = 0; |
266 FX_SAFE_DWORD required_bits = dwSharedObjTotal; | 267 FX_SAFE_UINT32 required_bits = dwSharedObjTotal; |
267 required_bits *= dwDeltaGroupLen; | 268 required_bits *= dwDeltaGroupLen; |
268 if (!CanReadFromBitStream(hStream, required_bits)) | 269 if (!CanReadFromBitStream(hStream, required_bits)) |
269 return FALSE; | 270 return FALSE; |
270 | 271 |
271 for (uint32_t i = 0; i < dwSharedObjTotal; ++i) { | 272 for (uint32_t i = 0; i < dwSharedObjTotal; ++i) { |
272 dwPrevObjLen = dwCurObjLen; | 273 dwPrevObjLen = dwCurObjLen; |
273 FX_SAFE_DWORD safeObjLen = hStream->GetBits(dwDeltaGroupLen); | 274 FX_SAFE_UINT32 safeObjLen = hStream->GetBits(dwDeltaGroupLen); |
274 safeObjLen += dwGroupLeastLen; | 275 safeObjLen += dwGroupLeastLen; |
275 if (!safeObjLen.IsValid()) | 276 if (!safeObjLen.IsValid()) |
276 return FALSE; | 277 return FALSE; |
277 | 278 |
278 dwCurObjLen = safeObjLen.ValueOrDie(); | 279 dwCurObjLen = safeObjLen.ValueOrDie(); |
279 if (i < m_nFirstPageSharedObjs) { | 280 if (i < m_nFirstPageSharedObjs) { |
280 m_dwSharedObjNumArray.Add(nFirstPageObjNum + i); | 281 m_dwSharedObjNumArray.Add(nFirstPageObjNum + i); |
281 if (i == 0) | 282 if (i == 0) |
282 m_szSharedObjOffsetArray.push_back(m_szFirstPageObjOffset); | 283 m_szSharedObjOffsetArray.push_back(m_szFirstPageObjOffset); |
283 } else { | 284 } else { |
284 FX_SAFE_DWORD safeObjNum = dwFirstSharedObjNum; | 285 FX_SAFE_UINT32 safeObjNum = dwFirstSharedObjNum; |
285 safeObjNum += i - m_nFirstPageSharedObjs; | 286 safeObjNum += i - m_nFirstPageSharedObjs; |
286 if (!safeObjNum.IsValid()) | 287 if (!safeObjNum.IsValid()) |
287 return FALSE; | 288 return FALSE; |
288 | 289 |
289 m_dwSharedObjNumArray.Add(safeObjNum.ValueOrDie()); | 290 m_dwSharedObjNumArray.Add(safeObjNum.ValueOrDie()); |
290 if (i == m_nFirstPageSharedObjs) { | 291 if (i == m_nFirstPageSharedObjs) { |
291 m_szSharedObjOffsetArray.push_back( | 292 m_szSharedObjOffsetArray.push_back( |
292 pdfium::base::checked_cast<int32_t>(dwFirstSharedObjLoc)); | 293 pdfium::base::checked_cast<int32_t>(dwFirstSharedObjLoc)); |
293 } | 294 } |
294 } | 295 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); | 463 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); |
463 if (!pRange) | 464 if (!pRange) |
464 return -1; | 465 return -1; |
465 | 466 |
466 CPDF_Object* pStreamLen = pRange->GetDirectObjectAt(1); | 467 CPDF_Object* pStreamLen = pRange->GetDirectObjectAt(1); |
467 if (!pStreamLen) | 468 if (!pStreamLen) |
468 return -1; | 469 return -1; |
469 | 470 |
470 return pStreamLen->GetInteger(); | 471 return pStreamLen->GetInteger(); |
471 } | 472 } |
OLD | NEW |