| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 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/include/fpdfapi/fpdf_parser.h" | 7 #include "core/include/fpdfapi/fpdf_parser.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 // A limit on the maximum object number in the xref table. Theoretical limits | 29 // A limit on the maximum object number in the xref table. Theoretical limits |
| 30 // are higher, but this may be large enough in practice. | 30 // are higher, but this may be large enough in practice. |
| 31 const FX_DWORD kMaxObjectNumber = 1048576; | 31 const FX_DWORD kMaxObjectNumber = 1048576; |
| 32 | 32 |
| 33 struct SearchTagRecord { | 33 struct SearchTagRecord { |
| 34 const char* m_pTag; | 34 const char* m_pTag; |
| 35 FX_DWORD m_Len; | 35 FX_DWORD m_Len; |
| 36 FX_DWORD m_Offset; | 36 FX_DWORD m_Offset; |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 int CompareFileSize(const void* p1, const void* p2) { | |
| 40 return *(FX_FILESIZE*)p1 - *(FX_FILESIZE*)p2; | |
| 41 } | |
| 42 | |
| 43 int32_t GetHeaderOffset(IFX_FileRead* pFile) { | 39 int32_t GetHeaderOffset(IFX_FileRead* pFile) { |
| 44 const FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025); | 40 const FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025); |
| 45 const size_t kBufSize = 4; | 41 const size_t kBufSize = 4; |
| 46 uint8_t buf[kBufSize]; | 42 uint8_t buf[kBufSize]; |
| 47 int32_t offset = 0; | 43 int32_t offset = 0; |
| 48 while (offset <= 1024) { | 44 while (offset <= 1024) { |
| 49 if (!pFile->ReadBlock(buf, offset, kBufSize)) | 45 if (!pFile->ReadBlock(buf, offset, kBufSize)) |
| 50 return -1; | 46 return -1; |
| 51 | 47 |
| 52 if (*(FX_DWORD*)buf == tag) | 48 if (*(FX_DWORD*)buf == tag) |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 } | 168 } |
| 173 ReleaseEncryptHandler(); | 169 ReleaseEncryptHandler(); |
| 174 SetEncryptDictionary(nullptr); | 170 SetEncryptDictionary(nullptr); |
| 175 if (m_bOwnFileRead && m_Syntax.m_pFileAccess) { | 171 if (m_bOwnFileRead && m_Syntax.m_pFileAccess) { |
| 176 m_Syntax.m_pFileAccess->Release(); | 172 m_Syntax.m_pFileAccess->Release(); |
| 177 m_Syntax.m_pFileAccess = nullptr; | 173 m_Syntax.m_pFileAccess = nullptr; |
| 178 } | 174 } |
| 179 m_ObjectStreamMap.clear(); | 175 m_ObjectStreamMap.clear(); |
| 180 m_ObjCache.clear(); | 176 m_ObjCache.clear(); |
| 181 | 177 |
| 182 m_SortedOffset.RemoveAll(); | 178 m_SortedOffset.clear(); |
| 183 m_ObjectInfo.clear(); | 179 m_ObjectInfo.clear(); |
| 184 int32_t iLen = m_Trailers.GetSize(); | 180 int32_t iLen = m_Trailers.GetSize(); |
| 185 for (int32_t i = 0; i < iLen; ++i) { | 181 for (int32_t i = 0; i < iLen; ++i) { |
| 186 if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) | 182 if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) |
| 187 trailer->Release(); | 183 trailer->Release(); |
| 188 } | 184 } |
| 189 m_Trailers.RemoveAll(); | 185 m_Trailers.RemoveAll(); |
| 190 if (m_pLinearized) { | 186 if (m_pLinearized) { |
| 191 m_pLinearized->Release(); | 187 m_pLinearized->Release(); |
| 192 m_pLinearized = nullptr; | 188 m_pLinearized = nullptr; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 219 m_FileVersion += FXSYS_toDecimalDigit(ch); | 215 m_FileVersion += FXSYS_toDecimalDigit(ch); |
| 220 | 216 |
| 221 if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) | 217 if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) |
| 222 return FORMAT_ERROR; | 218 return FORMAT_ERROR; |
| 223 | 219 |
| 224 m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9); | 220 m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9); |
| 225 m_pDocument = new CPDF_Document(this); | 221 m_pDocument = new CPDF_Document(this); |
| 226 | 222 |
| 227 FX_BOOL bXRefRebuilt = FALSE; | 223 FX_BOOL bXRefRebuilt = FALSE; |
| 228 if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) { | 224 if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) { |
| 229 FX_FILESIZE startxref_offset = m_Syntax.SavePos(); | 225 m_SortedOffset.insert(m_Syntax.SavePos()); |
| 230 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), | |
| 231 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), | |
| 232 CompareFileSize); | |
| 233 if (!pResult) | |
| 234 m_SortedOffset.Add(startxref_offset); | |
| 235 | |
| 236 m_Syntax.GetKeyword(); | 226 m_Syntax.GetKeyword(); |
| 237 bool bNumber; | 227 bool bNumber; |
| 238 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(&bNumber); | 228 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(&bNumber); |
| 239 if (!bNumber) | 229 if (!bNumber) |
| 240 return FORMAT_ERROR; | 230 return FORMAT_ERROR; |
| 241 | 231 |
| 242 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); | 232 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); |
| 243 if (!LoadAllCrossRefV4(m_LastXRefOffset) && | 233 if (!LoadAllCrossRefV4(m_LastXRefOffset) && |
| 244 !LoadAllCrossRefV5(m_LastXRefOffset)) { | 234 !LoadAllCrossRefV5(m_LastXRefOffset)) { |
| 245 if (!RebuildCrossRef()) | 235 if (!RebuildCrossRef()) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 268 return FORMAT_ERROR; | 258 return FORMAT_ERROR; |
| 269 | 259 |
| 270 eRet = SetEncryptHandler(); | 260 eRet = SetEncryptHandler(); |
| 271 if (eRet != SUCCESS) | 261 if (eRet != SUCCESS) |
| 272 return eRet; | 262 return eRet; |
| 273 | 263 |
| 274 m_pDocument->LoadDoc(); | 264 m_pDocument->LoadDoc(); |
| 275 if (!m_pDocument->GetRoot()) | 265 if (!m_pDocument->GetRoot()) |
| 276 return FORMAT_ERROR; | 266 return FORMAT_ERROR; |
| 277 } | 267 } |
| 278 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | |
| 279 sizeof(FX_FILESIZE), CompareFileSize); | |
| 280 if (GetRootObjNum() == 0) { | 268 if (GetRootObjNum() == 0) { |
| 281 ReleaseEncryptHandler(); | 269 ReleaseEncryptHandler(); |
| 282 if (!RebuildCrossRef() || GetRootObjNum() == 0) | 270 if (!RebuildCrossRef() || GetRootObjNum() == 0) |
| 283 return FORMAT_ERROR; | 271 return FORMAT_ERROR; |
| 284 | 272 |
| 285 eRet = SetEncryptHandler(); | 273 eRet = SetEncryptHandler(); |
| 286 if (eRet != SUCCESS) | 274 if (eRet != SUCCESS) |
| 287 return eRet; | 275 return eRet; |
| 288 } | 276 } |
| 289 if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) { | 277 if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 } | 347 } |
| 360 m_pTrailer = LoadTrailerV4(); | 348 m_pTrailer = LoadTrailerV4(); |
| 361 if (!m_pTrailer) { | 349 if (!m_pTrailer) { |
| 362 return FALSE; | 350 return FALSE; |
| 363 } | 351 } |
| 364 | 352 |
| 365 int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size"); | 353 int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size"); |
| 366 if (xrefsize > 0 && xrefsize <= kMaxXRefSize) | 354 if (xrefsize > 0 && xrefsize <= kMaxXRefSize) |
| 367 ShrinkObjectMap(xrefsize); | 355 ShrinkObjectMap(xrefsize); |
| 368 | 356 |
| 369 CFX_FileSizeArray CrossRefList; | 357 std::vector<FX_FILESIZE> CrossRefList; |
| 370 CFX_FileSizeArray XRefStreamList; | 358 std::vector<FX_FILESIZE> XRefStreamList; |
| 371 CrossRefList.Add(xrefpos); | 359 std::set<FX_FILESIZE> seen_xrefpos; |
| 372 XRefStreamList.Add(GetDirectInteger(m_pTrailer, "XRefStm")); | 360 CrossRefList.push_back(xrefpos); |
| 361 XRefStreamList.push_back(GetDirectInteger(m_pTrailer, "XRefStm")); |
| 362 seen_xrefpos.insert(xrefpos); |
| 373 | 363 |
| 374 std::set<FX_FILESIZE> seen_xrefpos; | |
| 375 seen_xrefpos.insert(xrefpos); | |
| 376 // When |m_pTrailer| doesn't have Prev entry or Prev entry value is not | 364 // When |m_pTrailer| doesn't have Prev entry or Prev entry value is not |
| 377 // numerical, GetDirectInteger() returns 0. Loading will end. | 365 // numerical, GetDirectInteger() returns 0. Loading will end. |
| 378 xrefpos = GetDirectInteger(m_pTrailer, "Prev"); | 366 xrefpos = GetDirectInteger(m_pTrailer, "Prev"); |
| 379 while (xrefpos) { | 367 while (xrefpos) { |
| 380 // Check for circular references. | 368 // Check for circular references. |
| 381 if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) | 369 if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) |
| 382 return FALSE; | 370 return FALSE; |
| 383 seen_xrefpos.insert(xrefpos); | 371 seen_xrefpos.insert(xrefpos); |
| 384 CrossRefList.InsertAt(0, xrefpos); | 372 // SLOW ... |
| 373 CrossRefList.insert(CrossRefList.begin(), xrefpos); |
| 385 LoadCrossRefV4(xrefpos, 0, TRUE); | 374 LoadCrossRefV4(xrefpos, 0, TRUE); |
| 386 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 375 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
| 387 LoadTrailerV4()); | 376 LoadTrailerV4()); |
| 388 if (!pDict) | 377 if (!pDict) |
| 389 return FALSE; | 378 return FALSE; |
| 390 xrefpos = GetDirectInteger(pDict.get(), "Prev"); | 379 xrefpos = GetDirectInteger(pDict.get(), "Prev"); |
| 391 | 380 // SLOW ... |
| 392 XRefStreamList.InsertAt(0, pDict->GetIntegerBy("XRefStm")); | 381 XRefStreamList.insert(XRefStreamList.begin(), |
| 382 pDict->GetIntegerBy("XRefStm")); |
| 393 m_Trailers.Add(pDict.release()); | 383 m_Trailers.Add(pDict.release()); |
| 394 } | 384 } |
| 395 for (int32_t i = 0; i < CrossRefList.GetSize(); i++) { | 385 for (size_t i = 0; i < CrossRefList.size(); ++i) { |
| 396 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) | 386 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) |
| 397 return FALSE; | 387 return FALSE; |
| 398 } | 388 } |
| 399 return TRUE; | 389 return TRUE; |
| 400 } | 390 } |
| 401 FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, | 391 FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, |
| 402 FX_DWORD dwObjCount) { | 392 FX_DWORD dwObjCount) { |
| 403 if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) { | 393 if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) { |
| 404 return FALSE; | 394 return FALSE; |
| 405 } | 395 } |
| 406 m_pTrailer = LoadTrailerV4(); | 396 m_pTrailer = LoadTrailerV4(); |
| 407 if (!m_pTrailer) { | 397 if (!m_pTrailer) { |
| 408 return FALSE; | 398 return FALSE; |
| 409 } | 399 } |
| 410 int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size"); | 400 int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size"); |
| 411 if (xrefsize == 0) { | 401 if (xrefsize == 0) { |
| 412 return FALSE; | 402 return FALSE; |
| 413 } | 403 } |
| 414 CFX_FileSizeArray CrossRefList, XRefStreamList; | |
| 415 CrossRefList.Add(xrefpos); | |
| 416 XRefStreamList.Add(GetDirectInteger(m_pTrailer, "XRefStm")); | |
| 417 | 404 |
| 405 std::vector<FX_FILESIZE> CrossRefList; |
| 406 std::vector<FX_FILESIZE> XRefStreamList; |
| 418 std::set<FX_FILESIZE> seen_xrefpos; | 407 std::set<FX_FILESIZE> seen_xrefpos; |
| 408 CrossRefList.push_back(xrefpos); |
| 409 XRefStreamList.push_back(GetDirectInteger(m_pTrailer, "XRefStm")); |
| 419 seen_xrefpos.insert(xrefpos); | 410 seen_xrefpos.insert(xrefpos); |
| 411 |
| 420 xrefpos = GetDirectInteger(m_pTrailer, "Prev"); | 412 xrefpos = GetDirectInteger(m_pTrailer, "Prev"); |
| 421 while (xrefpos) { | 413 while (xrefpos) { |
| 422 // Check for circular references. | 414 // Check for circular references. |
| 423 if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) | 415 if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) |
| 424 return FALSE; | 416 return FALSE; |
| 425 seen_xrefpos.insert(xrefpos); | 417 seen_xrefpos.insert(xrefpos); |
| 426 CrossRefList.InsertAt(0, xrefpos); | 418 // SLOW ... |
| 419 CrossRefList.insert(CrossRefList.begin(), xrefpos); |
| 427 LoadCrossRefV4(xrefpos, 0, TRUE); | 420 LoadCrossRefV4(xrefpos, 0, TRUE); |
| 428 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 421 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
| 429 LoadTrailerV4()); | 422 LoadTrailerV4()); |
| 430 if (!pDict) { | 423 if (!pDict) { |
| 431 return FALSE; | 424 return FALSE; |
| 432 } | 425 } |
| 433 xrefpos = GetDirectInteger(pDict.get(), "Prev"); | 426 xrefpos = GetDirectInteger(pDict.get(), "Prev"); |
| 434 | 427 // SLOW ... |
| 435 XRefStreamList.InsertAt(0, pDict->GetIntegerBy("XRefStm")); | 428 XRefStreamList.insert(XRefStreamList.begin(), |
| 429 pDict->GetIntegerBy("XRefStm")); |
| 436 m_Trailers.Add(pDict.release()); | 430 m_Trailers.Add(pDict.release()); |
| 437 } | 431 } |
| 438 for (int32_t i = 1; i < CrossRefList.GetSize(); i++) | 432 for (size_t i = 1; i < CrossRefList.size(); ++i) |
| 439 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) { | 433 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) { |
| 440 return FALSE; | 434 return FALSE; |
| 441 } | 435 } |
| 442 return TRUE; | 436 return TRUE; |
| 443 } | 437 } |
| 444 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, | 438 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
| 445 FX_DWORD dwObjCount) { | 439 FX_DWORD dwObjCount) { |
| 446 FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset; | 440 FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset; |
| 447 m_Syntax.RestorePos(dwStartPos); | 441 m_Syntax.RestorePos(dwStartPos); |
| 448 void* pResult = | 442 m_SortedOffset.insert(pos); |
| 449 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | |
| 450 sizeof(FX_FILESIZE), CompareFileSize); | |
| 451 if (!pResult) { | |
| 452 m_SortedOffset.Add(pos); | |
| 453 } | |
| 454 FX_DWORD start_objnum = 0; | 443 FX_DWORD start_objnum = 0; |
| 455 FX_DWORD count = dwObjCount; | 444 FX_DWORD count = dwObjCount; |
| 456 FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 445 FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
| 457 const int32_t recordsize = 20; | 446 const int32_t recordsize = 20; |
| 458 std::vector<char> buf(1024 * recordsize + 1); | 447 std::vector<char> buf(1024 * recordsize + 1); |
| 459 buf[1024 * recordsize] = '\0'; | 448 buf[1024 * recordsize] = '\0'; |
| 460 int32_t nBlocks = count / 1024 + 1; | 449 int32_t nBlocks = count / 1024 + 1; |
| 461 for (int32_t block = 0; block < nBlocks; block++) { | 450 for (int32_t block = 0; block < nBlocks; block++) { |
| 462 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; | 451 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; |
| 463 FX_DWORD dwReadSize = block_size * recordsize; | 452 FX_DWORD dwReadSize = block_size * recordsize; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 482 return FALSE; | 471 return FALSE; |
| 483 } | 472 } |
| 484 } | 473 } |
| 485 m_ObjectInfo[objnum].pos = offset; | 474 m_ObjectInfo[objnum].pos = offset; |
| 486 int32_t version = FXSYS_atoi(pEntry + 11); | 475 int32_t version = FXSYS_atoi(pEntry + 11); |
| 487 if (version >= 1) { | 476 if (version >= 1) { |
| 488 m_bVersionUpdated = TRUE; | 477 m_bVersionUpdated = TRUE; |
| 489 } | 478 } |
| 490 m_ObjectInfo[objnum].gennum = version; | 479 m_ObjectInfo[objnum].gennum = version; |
| 491 if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen) { | 480 if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen) { |
| 492 void* pResult = FXSYS_bsearch( | 481 m_SortedOffset.insert(m_ObjectInfo[objnum].pos); |
| 493 &m_ObjectInfo[objnum].pos, m_SortedOffset.GetData(), | |
| 494 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), CompareFileSize); | |
| 495 if (!pResult) { | |
| 496 m_SortedOffset.Add(m_ObjectInfo[objnum].pos); | |
| 497 } | |
| 498 } | 482 } |
| 499 m_ObjectInfo[objnum].type = 1; | 483 m_ObjectInfo[objnum].type = 1; |
| 500 } | 484 } |
| 501 } | 485 } |
| 502 } | 486 } |
| 503 m_Syntax.RestorePos(SavedPos + count * recordsize); | 487 m_Syntax.RestorePos(SavedPos + count * recordsize); |
| 504 return TRUE; | 488 return TRUE; |
| 505 } | 489 } |
| 506 | 490 |
| 507 bool CPDF_Parser::FindPosInOffsets(FX_FILESIZE pos) const { | |
| 508 return FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | |
| 509 sizeof(FX_FILESIZE), CompareFileSize); | |
| 510 } | |
| 511 | |
| 512 bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, | 491 bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
| 513 FX_FILESIZE streampos, | 492 FX_FILESIZE streampos, |
| 514 FX_BOOL bSkip) { | 493 FX_BOOL bSkip) { |
| 515 m_Syntax.RestorePos(pos); | 494 m_Syntax.RestorePos(pos); |
| 516 if (m_Syntax.GetKeyword() != "xref") | 495 if (m_Syntax.GetKeyword() != "xref") |
| 517 return false; | 496 return false; |
| 518 | 497 |
| 519 if (!FindPosInOffsets(pos)) | 498 m_SortedOffset.insert(pos); |
| 520 m_SortedOffset.Add(pos); | 499 if (streampos) |
| 521 | 500 m_SortedOffset.insert(streampos); |
| 522 if (streampos && !FindPosInOffsets(streampos)) | |
| 523 m_SortedOffset.Add(streampos); | |
| 524 | 501 |
| 525 while (1) { | 502 while (1) { |
| 526 FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 503 FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
| 527 bool bIsNumber; | 504 bool bIsNumber; |
| 528 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); | 505 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); |
| 529 if (word.IsEmpty()) | 506 if (word.IsEmpty()) |
| 530 return false; | 507 return false; |
| 531 | 508 |
| 532 if (!bIsNumber) { | 509 if (!bIsNumber) { |
| 533 m_Syntax.RestorePos(SavedPos); | 510 m_Syntax.RestorePos(SavedPos); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 563 if (!std::isdigit(pEntry[c])) | 540 if (!std::isdigit(pEntry[c])) |
| 564 return false; | 541 return false; |
| 565 } | 542 } |
| 566 } | 543 } |
| 567 m_ObjectInfo[objnum].pos = offset; | 544 m_ObjectInfo[objnum].pos = offset; |
| 568 int32_t version = FXSYS_atoi(pEntry + 11); | 545 int32_t version = FXSYS_atoi(pEntry + 11); |
| 569 if (version >= 1) { | 546 if (version >= 1) { |
| 570 m_bVersionUpdated = TRUE; | 547 m_bVersionUpdated = TRUE; |
| 571 } | 548 } |
| 572 m_ObjectInfo[objnum].gennum = version; | 549 m_ObjectInfo[objnum].gennum = version; |
| 573 if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen && | 550 if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen) { |
| 574 !FindPosInOffsets(m_ObjectInfo[objnum].pos)) { | 551 m_SortedOffset.insert(m_ObjectInfo[objnum].pos); |
| 575 m_SortedOffset.Add(m_ObjectInfo[objnum].pos); | |
| 576 } | 552 } |
| 577 m_ObjectInfo[objnum].type = 1; | 553 m_ObjectInfo[objnum].type = 1; |
| 578 } | 554 } |
| 579 } | 555 } |
| 580 } | 556 } |
| 581 } | 557 } |
| 582 m_Syntax.RestorePos(SavedPos + count * recordsize); | 558 m_Syntax.RestorePos(SavedPos + count * recordsize); |
| 583 } | 559 } |
| 584 return !streampos || LoadCrossRefV5(&streampos, FALSE); | 560 return !streampos || LoadCrossRefV5(&streampos, FALSE); |
| 585 } | 561 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 599 return FALSE; | 575 return FALSE; |
| 600 } | 576 } |
| 601 } | 577 } |
| 602 m_ObjectStreamMap.clear(); | 578 m_ObjectStreamMap.clear(); |
| 603 m_bXRefStream = TRUE; | 579 m_bXRefStream = TRUE; |
| 604 return TRUE; | 580 return TRUE; |
| 605 } | 581 } |
| 606 | 582 |
| 607 FX_BOOL CPDF_Parser::RebuildCrossRef() { | 583 FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| 608 m_ObjectInfo.clear(); | 584 m_ObjectInfo.clear(); |
| 609 m_SortedOffset.RemoveAll(); | 585 m_SortedOffset.clear(); |
| 610 if (m_pTrailer) { | 586 if (m_pTrailer) { |
| 611 m_pTrailer->Release(); | 587 m_pTrailer->Release(); |
| 612 m_pTrailer = NULL; | 588 m_pTrailer = NULL; |
| 613 } | 589 } |
| 614 int32_t status = 0; | 590 int32_t status = 0; |
| 615 int32_t inside_index = 0; | 591 int32_t inside_index = 0; |
| 616 FX_DWORD objnum = 0; | 592 FX_DWORD objnum = 0; |
| 617 FX_DWORD gennum = 0; | 593 FX_DWORD gennum = 0; |
| 618 int32_t depth = 0; | 594 int32_t depth = 0; |
| 619 const FX_DWORD kBufferSize = 4096; | 595 const FX_DWORD kBufferSize = 4096; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 inside_index++; | 736 inside_index++; |
| 761 } | 737 } |
| 762 break; | 738 break; |
| 763 case 3: | 739 case 3: |
| 764 if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) { | 740 if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) { |
| 765 if (objnum > 0x1000000) { | 741 if (objnum > 0x1000000) { |
| 766 status = 0; | 742 status = 0; |
| 767 break; | 743 break; |
| 768 } | 744 } |
| 769 FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset; | 745 FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset; |
| 746 m_SortedOffset.insert(obj_pos); |
| 770 last_obj = start_pos; | 747 last_obj = start_pos; |
| 771 void* pResult = | |
| 772 FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(), | |
| 773 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), | |
| 774 CompareFileSize); | |
| 775 if (!pResult) { | |
| 776 m_SortedOffset.Add(obj_pos); | |
| 777 } | |
| 778 FX_FILESIZE obj_end = 0; | 748 FX_FILESIZE obj_end = 0; |
| 779 CPDF_Object* pObject = ParseIndirectObjectAtByStrict( | 749 CPDF_Object* pObject = ParseIndirectObjectAtByStrict( |
| 780 m_pDocument, obj_pos, objnum, &obj_end); | 750 m_pDocument, obj_pos, objnum, &obj_end); |
| 781 if (CPDF_Stream* pStream = ToStream(pObject)) { | 751 if (CPDF_Stream* pStream = ToStream(pObject)) { |
| 782 if (CPDF_Dictionary* pDict = pStream->GetDict()) { | 752 if (CPDF_Dictionary* pDict = pStream->GetDict()) { |
| 783 if ((pDict->KeyExist("Type")) && | 753 if ((pDict->KeyExist("Type")) && |
| 784 (pDict->GetStringBy("Type") == "XRef" && | 754 (pDict->GetStringBy("Type") == "XRef" && |
| 785 pDict->KeyExist("Size"))) { | 755 pDict->KeyExist("Size"))) { |
| 786 CPDF_Object* pRoot = pDict->GetElement("Root"); | 756 CPDF_Object* pRoot = pDict->GetElement("Root"); |
| 787 if (pRoot && pRoot->GetDict() && | 757 if (pRoot && pRoot->GetDict() && |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 // If the position has not changed at all in a loop iteration, then break | 937 // If the position has not changed at all in a loop iteration, then break |
| 968 // out to prevent infinite looping. | 938 // out to prevent infinite looping. |
| 969 if (pos == saved_pos) | 939 if (pos == saved_pos) |
| 970 break; | 940 break; |
| 971 } | 941 } |
| 972 if (last_xref != -1 && last_xref > last_obj) { | 942 if (last_xref != -1 && last_xref > last_obj) { |
| 973 last_trailer = last_xref; | 943 last_trailer = last_xref; |
| 974 } else if (last_trailer == -1 || last_xref < last_obj) { | 944 } else if (last_trailer == -1 || last_xref < last_obj) { |
| 975 last_trailer = m_Syntax.m_FileLen; | 945 last_trailer = m_Syntax.m_FileLen; |
| 976 } | 946 } |
| 977 FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset; | 947 m_SortedOffset.insert(last_trailer - m_Syntax.m_HeaderOffset); |
| 978 void* pResult = | |
| 979 FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | |
| 980 sizeof(FX_FILESIZE), CompareFileSize); | |
| 981 if (!pResult) { | |
| 982 m_SortedOffset.Add(offset); | |
| 983 } | |
| 984 return m_pTrailer && !m_ObjectInfo.empty(); | 948 return m_pTrailer && !m_ObjectInfo.empty(); |
| 985 } | 949 } |
| 986 | 950 |
| 987 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) { | 951 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) { |
| 988 CPDF_Object* pObject = ParseIndirectObjectAt(m_pDocument, *pos, 0); | 952 CPDF_Object* pObject = ParseIndirectObjectAt(m_pDocument, *pos, 0); |
| 989 if (!pObject) | 953 if (!pObject) |
| 990 return FALSE; | 954 return FALSE; |
| 991 if (m_pDocument) { | 955 if (m_pDocument) { |
| 992 FX_BOOL bInserted = FALSE; | 956 FX_BOOL bInserted = FALSE; |
| 993 CPDF_Dictionary* pDict = m_pDocument->GetRoot(); | 957 CPDF_Dictionary* pDict = m_pDocument->GetRoot(); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1085 for (FX_DWORD j = 0; j < count; j++) { | 1049 for (FX_DWORD j = 0; j < count; j++) { |
| 1086 int32_t type = 1; | 1050 int32_t type = 1; |
| 1087 const uint8_t* entrystart = segstart + j * totalWidth; | 1051 const uint8_t* entrystart = segstart + j * totalWidth; |
| 1088 if (WidthArray[0]) { | 1052 if (WidthArray[0]) { |
| 1089 type = GetVarInt(entrystart, WidthArray[0]); | 1053 type = GetVarInt(entrystart, WidthArray[0]); |
| 1090 } | 1054 } |
| 1091 if (GetObjectType(startnum + j) == 255) { | 1055 if (GetObjectType(startnum + j) == 255) { |
| 1092 FX_FILESIZE offset = | 1056 FX_FILESIZE offset = |
| 1093 GetVarInt(entrystart + WidthArray[0], WidthArray[1]); | 1057 GetVarInt(entrystart + WidthArray[0], WidthArray[1]); |
| 1094 m_ObjectInfo[startnum + j].pos = offset; | 1058 m_ObjectInfo[startnum + j].pos = offset; |
| 1095 void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), | 1059 m_SortedOffset.insert(offset); |
| 1096 m_SortedOffset.GetSize(), | |
| 1097 sizeof(FX_FILESIZE), CompareFileSize); | |
| 1098 if (!pResult) { | |
| 1099 m_SortedOffset.Add(offset); | |
| 1100 } | |
| 1101 continue; | 1060 continue; |
| 1102 } | 1061 } |
| 1103 if (GetObjectType(startnum + j)) { | 1062 if (GetObjectType(startnum + j)) { |
| 1104 continue; | 1063 continue; |
| 1105 } | 1064 } |
| 1106 m_ObjectInfo[startnum + j].type = type; | 1065 m_ObjectInfo[startnum + j].type = type; |
| 1107 if (type == 0) { | 1066 if (type == 0) { |
| 1108 m_ObjectInfo[startnum + j].pos = 0; | 1067 m_ObjectInfo[startnum + j].pos = 0; |
| 1109 } else { | 1068 } else { |
| 1110 FX_FILESIZE offset = | 1069 FX_FILESIZE offset = |
| 1111 GetVarInt(entrystart + WidthArray[0], WidthArray[1]); | 1070 GetVarInt(entrystart + WidthArray[0], WidthArray[1]); |
| 1112 m_ObjectInfo[startnum + j].pos = offset; | 1071 m_ObjectInfo[startnum + j].pos = offset; |
| 1113 if (type == 1) { | 1072 if (type == 1) { |
| 1114 void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), | 1073 m_SortedOffset.insert(offset); |
| 1115 m_SortedOffset.GetSize(), | |
| 1116 sizeof(FX_FILESIZE), CompareFileSize); | |
| 1117 if (!pResult) { | |
| 1118 m_SortedOffset.Add(offset); | |
| 1119 } | |
| 1120 } else { | 1074 } else { |
| 1121 if (offset < 0 || !IsValidObjectNumber(offset)) { | 1075 if (offset < 0 || !IsValidObjectNumber(offset)) { |
| 1122 pStream->Release(); | 1076 pStream->Release(); |
| 1123 return FALSE; | 1077 return FALSE; |
| 1124 } | 1078 } |
| 1125 m_ObjectInfo[offset].type = 255; | 1079 m_ObjectInfo[offset].type = 255; |
| 1126 } | 1080 } |
| 1127 } | 1081 } |
| 1128 } | 1082 } |
| 1129 segindex += count; | 1083 segindex += count; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1154 } | 1108 } |
| 1155 FX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) { | 1109 FX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) { |
| 1156 bForm = FALSE; | 1110 bForm = FALSE; |
| 1157 if (!IsValidObjectNumber(objnum)) | 1111 if (!IsValidObjectNumber(objnum)) |
| 1158 return TRUE; | 1112 return TRUE; |
| 1159 if (GetObjectType(objnum) == 0) | 1113 if (GetObjectType(objnum) == 0) |
| 1160 return TRUE; | 1114 return TRUE; |
| 1161 if (GetObjectType(objnum) == 2) | 1115 if (GetObjectType(objnum) == 2) |
| 1162 return TRUE; | 1116 return TRUE; |
| 1163 FX_FILESIZE pos = m_ObjectInfo[objnum].pos; | 1117 FX_FILESIZE pos = m_ObjectInfo[objnum].pos; |
| 1164 void* pResult = | 1118 auto it = m_SortedOffset.find(pos); |
| 1165 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | 1119 if (it == m_SortedOffset.end()) |
| 1166 sizeof(FX_FILESIZE), CompareFileSize); | |
| 1167 if (!pResult) { | |
| 1168 return TRUE; | 1120 return TRUE; |
| 1169 } | 1121 if (++it == m_SortedOffset.end()) |
| 1170 if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == | |
| 1171 m_SortedOffset.GetSize() - 1) { | |
| 1172 return FALSE; | 1122 return FALSE; |
| 1173 } | 1123 FX_FILESIZE size = *it - pos; |
| 1174 FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos; | |
| 1175 FX_FILESIZE SavedPos = m_Syntax.SavePos(); | 1124 FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
| 1176 m_Syntax.RestorePos(pos); | 1125 m_Syntax.RestorePos(pos); |
| 1177 const char kFormStream[] = "/Form\0stream"; | 1126 const char kFormStream[] = "/Form\0stream"; |
| 1178 const CFX_ByteStringC kFormStreamStr(kFormStream, sizeof(kFormStream) - 1); | 1127 const CFX_ByteStringC kFormStreamStr(kFormStream, sizeof(kFormStream) - 1); |
| 1179 bForm = m_Syntax.SearchMultiWord(kFormStreamStr, TRUE, size) == 0; | 1128 bForm = m_Syntax.SearchMultiWord(kFormStreamStr, TRUE, size) == 0; |
| 1180 m_Syntax.RestorePos(SavedPos); | 1129 m_Syntax.RestorePos(SavedPos); |
| 1181 return TRUE; | 1130 return TRUE; |
| 1182 } | 1131 } |
| 1183 | 1132 |
| 1184 CPDF_Object* CPDF_Parser::ParseIndirectObject( | 1133 CPDF_Object* CPDF_Parser::ParseIndirectObject( |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 return pStreamAcc; | 1195 return pStreamAcc; |
| 1247 } | 1196 } |
| 1248 | 1197 |
| 1249 FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) const { | 1198 FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) const { |
| 1250 if (!IsValidObjectNumber(objnum)) | 1199 if (!IsValidObjectNumber(objnum)) |
| 1251 return 0; | 1200 return 0; |
| 1252 | 1201 |
| 1253 if (GetObjectType(objnum) == 2) | 1202 if (GetObjectType(objnum) == 2) |
| 1254 objnum = GetObjectPositionOrZero(objnum); | 1203 objnum = GetObjectPositionOrZero(objnum); |
| 1255 | 1204 |
| 1256 if (GetObjectType(objnum) == 1 || GetObjectType(objnum) == 255) { | 1205 if (GetObjectType(objnum) != 1 && GetObjectType(objnum) != 255) |
| 1257 FX_FILESIZE offset = GetObjectPositionOrZero(objnum); | 1206 return 0; |
| 1258 if (offset == 0) | |
| 1259 return 0; | |
| 1260 | 1207 |
| 1261 FX_FILESIZE* pResult = static_cast<FX_FILESIZE*>(FXSYS_bsearch( | 1208 FX_FILESIZE offset = GetObjectPositionOrZero(objnum); |
| 1262 &offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | 1209 if (offset == 0) |
| 1263 sizeof(FX_FILESIZE), CompareFileSize)); | 1210 return 0; |
| 1264 if (!pResult) | |
| 1265 return 0; | |
| 1266 | 1211 |
| 1267 if (pResult - m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) | 1212 auto it = m_SortedOffset.find(offset); |
| 1268 return 0; | 1213 if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end()) |
| 1214 return 0; |
| 1269 | 1215 |
| 1270 return pResult[1] - offset; | 1216 return *it - offset; |
| 1271 } | |
| 1272 return 0; | |
| 1273 } | 1217 } |
| 1274 | 1218 |
| 1275 void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, | 1219 void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, |
| 1276 uint8_t*& pBuffer, | 1220 uint8_t*& pBuffer, |
| 1277 FX_DWORD& size) { | 1221 FX_DWORD& size) { |
| 1278 pBuffer = NULL; | 1222 pBuffer = NULL; |
| 1279 size = 0; | 1223 size = 0; |
| 1280 if (!IsValidObjectNumber(objnum)) | 1224 if (!IsValidObjectNumber(objnum)) |
| 1281 return; | 1225 return; |
| 1282 | 1226 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1334 } | 1278 } |
| 1335 word = m_Syntax.GetNextWord(&bIsNumber); | 1279 word = m_Syntax.GetNextWord(&bIsNumber); |
| 1336 if (!bIsNumber) { | 1280 if (!bIsNumber) { |
| 1337 m_Syntax.RestorePos(SavedPos); | 1281 m_Syntax.RestorePos(SavedPos); |
| 1338 return; | 1282 return; |
| 1339 } | 1283 } |
| 1340 if (m_Syntax.GetKeyword() != "obj") { | 1284 if (m_Syntax.GetKeyword() != "obj") { |
| 1341 m_Syntax.RestorePos(SavedPos); | 1285 m_Syntax.RestorePos(SavedPos); |
| 1342 return; | 1286 return; |
| 1343 } | 1287 } |
| 1344 void* pResult = | 1288 auto it = m_SortedOffset.find(pos); |
| 1345 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | 1289 if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end()) { |
| 1346 sizeof(FX_FILESIZE), CompareFileSize); | |
| 1347 if (!pResult) { | |
| 1348 m_Syntax.RestorePos(SavedPos); | 1290 m_Syntax.RestorePos(SavedPos); |
| 1349 return; | 1291 return; |
| 1350 } | 1292 } |
| 1351 FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1]; | 1293 FX_FILESIZE nextoff = *it; |
| 1352 FX_BOOL bNextOffValid = FALSE; | 1294 FX_BOOL bNextOffValid = FALSE; |
| 1353 if (nextoff != pos) { | 1295 if (nextoff != pos) { |
| 1354 m_Syntax.RestorePos(nextoff); | 1296 m_Syntax.RestorePos(nextoff); |
| 1355 word = m_Syntax.GetNextWord(&bIsNumber); | 1297 word = m_Syntax.GetNextWord(&bIsNumber); |
| 1356 if (word == "xref") { | 1298 if (word == "xref") { |
| 1357 bNextOffValid = TRUE; | 1299 bNextOffValid = TRUE; |
| 1358 } else if (bIsNumber) { | 1300 } else if (bIsNumber) { |
| 1359 word = m_Syntax.GetNextWord(&bIsNumber); | 1301 word = m_Syntax.GetNextWord(&bIsNumber); |
| 1360 if (bIsNumber && m_Syntax.GetKeyword() == "obj") { | 1302 if (bIsNumber && m_Syntax.GetKeyword() == "obj") { |
| 1361 bNextOffValid = TRUE; | 1303 bNextOffValid = TRUE; |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1587 } | 1529 } |
| 1588 eRet = SetEncryptHandler(); | 1530 eRet = SetEncryptHandler(); |
| 1589 if (eRet != SUCCESS) { | 1531 if (eRet != SUCCESS) { |
| 1590 return eRet; | 1532 return eRet; |
| 1591 } | 1533 } |
| 1592 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); | 1534 m_pDocument->LoadAsynDoc(m_pLinearized->GetDict()); |
| 1593 if (!m_pDocument->GetRoot()) { | 1535 if (!m_pDocument->GetRoot()) { |
| 1594 return FORMAT_ERROR; | 1536 return FORMAT_ERROR; |
| 1595 } | 1537 } |
| 1596 } | 1538 } |
| 1597 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | |
| 1598 sizeof(FX_FILESIZE), CompareFileSize); | |
| 1599 if (GetRootObjNum() == 0) { | 1539 if (GetRootObjNum() == 0) { |
| 1600 ReleaseEncryptHandler(); | 1540 ReleaseEncryptHandler(); |
| 1601 if (!RebuildCrossRef() || GetRootObjNum() == 0) | 1541 if (!RebuildCrossRef() || GetRootObjNum() == 0) |
| 1602 return FORMAT_ERROR; | 1542 return FORMAT_ERROR; |
| 1603 | 1543 |
| 1604 eRet = SetEncryptHandler(); | 1544 eRet = SetEncryptHandler(); |
| 1605 if (eRet != SUCCESS) { | 1545 if (eRet != SUCCESS) { |
| 1606 return eRet; | 1546 return eRet; |
| 1607 } | 1547 } |
| 1608 } | 1548 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1656 m_LastXRefOffset += dwCount; | 1596 m_LastXRefOffset += dwCount; |
| 1657 m_ObjectStreamMap.clear(); | 1597 m_ObjectStreamMap.clear(); |
| 1658 m_ObjCache.clear(); | 1598 m_ObjCache.clear(); |
| 1659 | 1599 |
| 1660 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && | 1600 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && |
| 1661 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { | 1601 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { |
| 1662 m_LastXRefOffset = 0; | 1602 m_LastXRefOffset = 0; |
| 1663 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; | 1603 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; |
| 1664 return FORMAT_ERROR; | 1604 return FORMAT_ERROR; |
| 1665 } | 1605 } |
| 1666 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | |
| 1667 sizeof(FX_FILESIZE), CompareFileSize); | |
| 1668 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; | 1606 m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; |
| 1669 return SUCCESS; | 1607 return SUCCESS; |
| 1670 } | 1608 } |
| 1671 | 1609 |
| 1672 // static | 1610 // static |
| 1673 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; | 1611 int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; |
| 1674 | 1612 |
| 1675 CPDF_SyntaxParser::CPDF_SyntaxParser() { | 1613 CPDF_SyntaxParser::CPDF_SyntaxParser() { |
| 1676 m_pFileAccess = NULL; | 1614 m_pFileAccess = NULL; |
| 1677 m_pFileBuf = NULL; | 1615 m_pFileBuf = NULL; |
| (...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2657 CPDF_PageNode* pPageNode, | 2595 CPDF_PageNode* pPageNode, |
| 2658 IFX_DownloadHints* pHints); | 2596 IFX_DownloadHints* pHints); |
| 2659 FX_BOOL CheckPageCount(IFX_DownloadHints* pHints); | 2597 FX_BOOL CheckPageCount(IFX_DownloadHints* pHints); |
| 2660 bool IsFirstCheck(int iPage); | 2598 bool IsFirstCheck(int iPage); |
| 2661 void ResetFirstCheck(int iPage); | 2599 void ResetFirstCheck(int iPage); |
| 2662 FX_BOOL IsDataAvail(FX_FILESIZE offset, | 2600 FX_BOOL IsDataAvail(FX_FILESIZE offset, |
| 2663 FX_DWORD size, | 2601 FX_DWORD size, |
| 2664 IFX_DownloadHints* pHints); | 2602 IFX_DownloadHints* pHints); |
| 2665 | 2603 |
| 2666 CPDF_Parser m_parser; | 2604 CPDF_Parser m_parser; |
| 2667 | |
| 2668 CPDF_SyntaxParser m_syntaxParser; | 2605 CPDF_SyntaxParser m_syntaxParser; |
| 2669 | |
| 2670 CPDF_Object* m_pRoot; | 2606 CPDF_Object* m_pRoot; |
| 2671 | |
| 2672 FX_DWORD m_dwRootObjNum; | 2607 FX_DWORD m_dwRootObjNum; |
| 2673 | |
| 2674 FX_DWORD m_dwInfoObjNum; | 2608 FX_DWORD m_dwInfoObjNum; |
| 2675 | |
| 2676 CPDF_Object* m_pLinearized; | 2609 CPDF_Object* m_pLinearized; |
| 2677 | |
| 2678 CPDF_Object* m_pTrailer; | 2610 CPDF_Object* m_pTrailer; |
| 2679 | |
| 2680 FX_BOOL m_bDocAvail; | 2611 FX_BOOL m_bDocAvail; |
| 2681 | |
| 2682 FX_FILESIZE m_dwHeaderOffset; | 2612 FX_FILESIZE m_dwHeaderOffset; |
| 2683 | |
| 2684 FX_FILESIZE m_dwLastXRefOffset; | 2613 FX_FILESIZE m_dwLastXRefOffset; |
| 2685 | |
| 2686 FX_FILESIZE m_dwXRefOffset; | 2614 FX_FILESIZE m_dwXRefOffset; |
| 2687 | |
| 2688 FX_FILESIZE m_dwTrailerOffset; | 2615 FX_FILESIZE m_dwTrailerOffset; |
| 2689 | |
| 2690 FX_FILESIZE m_dwCurrentOffset; | 2616 FX_FILESIZE m_dwCurrentOffset; |
| 2691 | |
| 2692 PDF_DATAAVAIL_STATUS m_docStatus; | 2617 PDF_DATAAVAIL_STATUS m_docStatus; |
| 2693 | |
| 2694 FX_FILESIZE m_dwFileLen; | 2618 FX_FILESIZE m_dwFileLen; |
| 2695 | |
| 2696 CPDF_Document* m_pDocument; | 2619 CPDF_Document* m_pDocument; |
| 2697 | |
| 2698 std::set<FX_DWORD> m_ObjectSet; | 2620 std::set<FX_DWORD> m_ObjectSet; |
| 2699 | |
| 2700 CFX_ArrayTemplate<CPDF_Object*> m_objs_array; | 2621 CFX_ArrayTemplate<CPDF_Object*> m_objs_array; |
| 2701 | |
| 2702 FX_FILESIZE m_Pos; | 2622 FX_FILESIZE m_Pos; |
| 2703 | |
| 2704 FX_FILESIZE m_bufferOffset; | 2623 FX_FILESIZE m_bufferOffset; |
| 2705 | |
| 2706 FX_DWORD m_bufferSize; | 2624 FX_DWORD m_bufferSize; |
| 2707 | |
| 2708 CFX_ByteString m_WordBuf; | 2625 CFX_ByteString m_WordBuf; |
| 2709 | |
| 2710 uint8_t m_bufferData[512]; | 2626 uint8_t m_bufferData[512]; |
| 2711 | |
| 2712 CFX_FileSizeArray m_CrossOffset; | |
| 2713 | |
| 2714 CFX_DWordArray m_XRefStreamList; | 2627 CFX_DWordArray m_XRefStreamList; |
| 2715 | |
| 2716 CFX_DWordArray m_PageObjList; | 2628 CFX_DWordArray m_PageObjList; |
| 2717 | |
| 2718 FX_DWORD m_PagesObjNum; | 2629 FX_DWORD m_PagesObjNum; |
| 2719 | |
| 2720 FX_BOOL m_bLinearized; | 2630 FX_BOOL m_bLinearized; |
| 2721 | |
| 2722 FX_DWORD m_dwFirstPageNo; | 2631 FX_DWORD m_dwFirstPageNo; |
| 2723 | |
| 2724 FX_BOOL m_bLinearedDataOK; | 2632 FX_BOOL m_bLinearedDataOK; |
| 2725 | |
| 2726 FX_BOOL m_bMainXRefLoadTried; | 2633 FX_BOOL m_bMainXRefLoadTried; |
| 2727 | |
| 2728 FX_BOOL m_bMainXRefLoadedOK; | 2634 FX_BOOL m_bMainXRefLoadedOK; |
| 2729 | |
| 2730 FX_BOOL m_bPagesTreeLoad; | 2635 FX_BOOL m_bPagesTreeLoad; |
| 2731 | |
| 2732 FX_BOOL m_bPagesLoad; | 2636 FX_BOOL m_bPagesLoad; |
| 2733 | |
| 2734 CPDF_Parser* m_pCurrentParser; | 2637 CPDF_Parser* m_pCurrentParser; |
| 2735 | |
| 2736 FX_FILESIZE m_dwCurrentXRefSteam; | 2638 FX_FILESIZE m_dwCurrentXRefSteam; |
| 2737 | |
| 2738 FX_BOOL m_bAnnotsLoad; | 2639 FX_BOOL m_bAnnotsLoad; |
| 2739 | |
| 2740 FX_BOOL m_bHaveAcroForm; | 2640 FX_BOOL m_bHaveAcroForm; |
| 2741 | |
| 2742 FX_DWORD m_dwAcroFormObjNum; | 2641 FX_DWORD m_dwAcroFormObjNum; |
| 2743 | |
| 2744 FX_BOOL m_bAcroFormLoad; | 2642 FX_BOOL m_bAcroFormLoad; |
| 2745 | |
| 2746 CPDF_Object* m_pAcroForm; | 2643 CPDF_Object* m_pAcroForm; |
| 2747 | |
| 2748 CFX_ArrayTemplate<CPDF_Object*> m_arrayAcroforms; | 2644 CFX_ArrayTemplate<CPDF_Object*> m_arrayAcroforms; |
| 2749 | |
| 2750 CPDF_Dictionary* m_pPageDict; | 2645 CPDF_Dictionary* m_pPageDict; |
| 2751 | |
| 2752 CPDF_Object* m_pPageResource; | 2646 CPDF_Object* m_pPageResource; |
| 2753 | |
| 2754 FX_BOOL m_bNeedDownLoadResource; | 2647 FX_BOOL m_bNeedDownLoadResource; |
| 2755 | |
| 2756 FX_BOOL m_bPageLoadedOK; | 2648 FX_BOOL m_bPageLoadedOK; |
| 2757 | |
| 2758 FX_BOOL m_bLinearizedFormParamLoad; | 2649 FX_BOOL m_bLinearizedFormParamLoad; |
| 2759 | |
| 2760 CFX_ArrayTemplate<CPDF_Object*> m_PagesArray; | 2650 CFX_ArrayTemplate<CPDF_Object*> m_PagesArray; |
| 2761 | |
| 2762 FX_DWORD m_dwEncryptObjNum; | 2651 FX_DWORD m_dwEncryptObjNum; |
| 2763 | |
| 2764 FX_FILESIZE m_dwPrevXRefOffset; | 2652 FX_FILESIZE m_dwPrevXRefOffset; |
| 2765 | |
| 2766 FX_BOOL m_bTotalLoadPageTree; | 2653 FX_BOOL m_bTotalLoadPageTree; |
| 2767 | |
| 2768 FX_BOOL m_bCurPageDictLoadOK; | 2654 FX_BOOL m_bCurPageDictLoadOK; |
| 2769 | |
| 2770 CPDF_PageNode m_pageNodes; | 2655 CPDF_PageNode m_pageNodes; |
| 2771 | |
| 2772 std::set<FX_DWORD> m_pageMapCheckState; | 2656 std::set<FX_DWORD> m_pageMapCheckState; |
| 2773 std::set<FX_DWORD> m_pagesLoadState; | 2657 std::set<FX_DWORD> m_pagesLoadState; |
| 2774 | |
| 2775 std::unique_ptr<CPDF_HintTables> m_pHintTables; | 2658 std::unique_ptr<CPDF_HintTables> m_pHintTables; |
| 2776 FX_BOOL m_bSupportHintTable; | 2659 FX_BOOL m_bSupportHintTable; |
| 2777 }; | 2660 }; |
| 2778 | 2661 |
| 2779 IPDF_DataAvail::IPDF_DataAvail(IFX_FileAvail* pFileAvail, | 2662 IPDF_DataAvail::IPDF_DataAvail(IFX_FileAvail* pFileAvail, |
| 2780 IFX_FileRead* pFileRead) | 2663 IFX_FileRead* pFileRead) |
| 2781 : m_pFileAvail(pFileAvail), m_pFileRead(pFileRead) {} | 2664 : m_pFileAvail(pFileAvail), m_pFileRead(pFileRead) {} |
| 2782 | 2665 |
| 2783 // static | 2666 // static |
| 2784 IPDF_DataAvail* IPDF_DataAvail::Create(IFX_FileAvail* pFileAvail, | 2667 IPDF_DataAvail* IPDF_DataAvail::Create(IFX_FileAvail* pFileAvail, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2858 m_pDocument = pDoc; | 2741 m_pDocument = pDoc; |
| 2859 } | 2742 } |
| 2860 FX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset) { | 2743 FX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset) { |
| 2861 CPDF_Parser* pParser = m_pDocument->GetParser(); | 2744 CPDF_Parser* pParser = m_pDocument->GetParser(); |
| 2862 if (!pParser || !pParser->IsValidObjectNumber(objnum)) | 2745 if (!pParser || !pParser->IsValidObjectNumber(objnum)) |
| 2863 return 0; | 2746 return 0; |
| 2864 | 2747 |
| 2865 if (pParser->GetObjectType(objnum) == 2) | 2748 if (pParser->GetObjectType(objnum) == 2) |
| 2866 objnum = pParser->GetObjectPositionOrZero(objnum); | 2749 objnum = pParser->GetObjectPositionOrZero(objnum); |
| 2867 | 2750 |
| 2868 if (pParser->GetObjectType(objnum) == 1 || | 2751 if (pParser->GetObjectType(objnum) != 1 && |
| 2869 pParser->GetObjectType(objnum) == 255) { | 2752 pParser->GetObjectType(objnum) != 255) { |
| 2870 offset = pParser->GetObjectPositionOrZero(objnum); | 2753 return 0; |
| 2871 if (offset == 0) { | |
| 2872 return 0; | |
| 2873 } | |
| 2874 void* pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(), | |
| 2875 pParser->m_SortedOffset.GetSize(), | |
| 2876 sizeof(FX_FILESIZE), CompareFileSize); | |
| 2877 if (!pResult) { | |
| 2878 return 0; | |
| 2879 } | |
| 2880 if ((FX_FILESIZE*)pResult - | |
| 2881 (FX_FILESIZE*)pParser->m_SortedOffset.GetData() == | |
| 2882 pParser->m_SortedOffset.GetSize() - 1) { | |
| 2883 return 0; | |
| 2884 } | |
| 2885 return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset); | |
| 2886 } | 2754 } |
| 2887 return 0; | 2755 |
| 2756 offset = pParser->GetObjectPositionOrZero(objnum); |
| 2757 if (offset == 0) |
| 2758 return 0; |
| 2759 |
| 2760 auto it = pParser->m_SortedOffset.find(offset); |
| 2761 if (it == pParser->m_SortedOffset.end() || |
| 2762 ++it == pParser->m_SortedOffset.end()) { |
| 2763 return 0; |
| 2764 } |
| 2765 return *it - offset; |
| 2888 } | 2766 } |
| 2889 FX_BOOL CPDF_DataAvail::IsObjectsAvail( | 2767 FX_BOOL CPDF_DataAvail::IsObjectsAvail( |
| 2890 CFX_ArrayTemplate<CPDF_Object*>& obj_array, | 2768 CFX_ArrayTemplate<CPDF_Object*>& obj_array, |
| 2891 FX_BOOL bParsePage, | 2769 FX_BOOL bParsePage, |
| 2892 IFX_DownloadHints* pHints, | 2770 IFX_DownloadHints* pHints, |
| 2893 CFX_ArrayTemplate<CPDF_Object*>& ret_array) { | 2771 CFX_ArrayTemplate<CPDF_Object*>& ret_array) { |
| 2894 if (!obj_array.GetSize()) { | 2772 if (!obj_array.GetSize()) { |
| 2895 return TRUE; | 2773 return TRUE; |
| 2896 } | 2774 } |
| 2897 FX_DWORD count = 0; | 2775 FX_DWORD count = 0; |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3100 return FALSE; | 2978 return FALSE; |
| 3101 } | 2979 } |
| 3102 FX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints) { | 2980 FX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints) { |
| 3103 m_parser.m_Syntax.InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset); | 2981 m_parser.m_Syntax.InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset); |
| 3104 m_parser.m_bOwnFileRead = false; | 2982 m_parser.m_bOwnFileRead = false; |
| 3105 if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && | 2983 if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && |
| 3106 !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) { | 2984 !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) { |
| 3107 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; | 2985 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; |
| 3108 return FALSE; | 2986 return FALSE; |
| 3109 } | 2987 } |
| 3110 FXSYS_qsort(m_parser.m_SortedOffset.GetData(), | |
| 3111 m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), | |
| 3112 CompareFileSize); | |
| 3113 m_dwRootObjNum = m_parser.GetRootObjNum(); | 2988 m_dwRootObjNum = m_parser.GetRootObjNum(); |
| 3114 m_dwInfoObjNum = m_parser.GetInfoObjNum(); | 2989 m_dwInfoObjNum = m_parser.GetInfoObjNum(); |
| 3115 m_pCurrentParser = &m_parser; | 2990 m_pCurrentParser = &m_parser; |
| 3116 m_docStatus = PDF_DATAAVAIL_ROOT; | 2991 m_docStatus = PDF_DATAAVAIL_ROOT; |
| 3117 return TRUE; | 2992 return TRUE; |
| 3118 } | 2993 } |
| 3119 CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, | 2994 CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, |
| 3120 IFX_DownloadHints* pHints, | 2995 IFX_DownloadHints* pHints, |
| 3121 FX_BOOL* pExistInFile) { | 2996 FX_BOOL* pExistInFile) { |
| 3122 CPDF_Object* pRet = nullptr; | 2997 CPDF_Object* pRet = nullptr; |
| (...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3803 } | 3678 } |
| 3804 FX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints) { | 3679 FX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints) { |
| 3805 int32_t iSize = 0; | 3680 int32_t iSize = 0; |
| 3806 CFX_ByteString token; | 3681 CFX_ByteString token; |
| 3807 if (!GetNextToken(token)) { | 3682 if (!GetNextToken(token)) { |
| 3808 iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); | 3683 iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); |
| 3809 pHints->AddSegment(m_Pos, iSize); | 3684 pHints->AddSegment(m_Pos, iSize); |
| 3810 return FALSE; | 3685 return FALSE; |
| 3811 } | 3686 } |
| 3812 if (token == "xref") { | 3687 if (token == "xref") { |
| 3813 m_CrossOffset.InsertAt(0, m_dwXRefOffset); | |
| 3814 while (1) { | 3688 while (1) { |
| 3815 if (!GetNextToken(token)) { | 3689 if (!GetNextToken(token)) { |
| 3816 iSize = | 3690 iSize = |
| 3817 (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); | 3691 (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); |
| 3818 pHints->AddSegment(m_Pos, iSize); | 3692 pHints->AddSegment(m_Pos, iSize); |
| 3819 m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM; | 3693 m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM; |
| 3820 return FALSE; | 3694 return FALSE; |
| 3821 } | 3695 } |
| 3822 if (token == "trailer") { | 3696 if (token == "trailer") { |
| 3823 m_dwTrailerOffset = m_Pos; | 3697 m_dwTrailerOffset = m_Pos; |
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4479 for (int32_t i = 0; i < m_childNode.GetSize(); ++i) { | 4353 for (int32_t i = 0; i < m_childNode.GetSize(); ++i) { |
| 4480 delete m_childNode[i]; | 4354 delete m_childNode[i]; |
| 4481 } | 4355 } |
| 4482 m_childNode.RemoveAll(); | 4356 m_childNode.RemoveAll(); |
| 4483 } | 4357 } |
| 4484 CPDF_HintTables::~CPDF_HintTables() { | 4358 CPDF_HintTables::~CPDF_HintTables() { |
| 4485 m_dwDeltaNObjsArray.RemoveAll(); | 4359 m_dwDeltaNObjsArray.RemoveAll(); |
| 4486 m_dwNSharedObjsArray.RemoveAll(); | 4360 m_dwNSharedObjsArray.RemoveAll(); |
| 4487 m_dwSharedObjNumArray.RemoveAll(); | 4361 m_dwSharedObjNumArray.RemoveAll(); |
| 4488 m_dwIdentifierArray.RemoveAll(); | 4362 m_dwIdentifierArray.RemoveAll(); |
| 4489 m_szPageOffsetArray.RemoveAll(); | |
| 4490 m_szSharedObjOffsetArray.RemoveAll(); | |
| 4491 } | 4363 } |
| 4492 FX_DWORD CPDF_HintTables::GetItemLength(int index, | 4364 FX_DWORD CPDF_HintTables::GetItemLength( |
| 4493 const CFX_FileSizeArray& szArray) { | 4365 int index, |
| 4494 if (index < 0 || szArray.GetSize() < 2 || index > szArray.GetSize() - 2 || | 4366 const std::vector<FX_FILESIZE>& szArray) { |
| 4495 szArray[index] > szArray[index + 1]) | 4367 if (index < 0 || szArray.size() < 2 || |
| 4368 static_cast<size_t>(index) > szArray.size() - 2 || |
| 4369 szArray[index] > szArray[index + 1]) { |
| 4496 return 0; | 4370 return 0; |
| 4371 } |
| 4497 return szArray[index + 1] - szArray[index]; | 4372 return szArray[index + 1] - szArray[index]; |
| 4498 } | 4373 } |
| 4499 FX_BOOL CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) { | 4374 FX_BOOL CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) { |
| 4500 if (!hStream || hStream->IsEOF()) | 4375 if (!hStream || hStream->IsEOF()) |
| 4501 return FALSE; | 4376 return FALSE; |
| 4502 int nStreamOffset = ReadPrimaryHintStreamOffset(); | 4377 int nStreamOffset = ReadPrimaryHintStreamOffset(); |
| 4503 int nStreamLen = ReadPrimaryHintStreamLength(); | 4378 int nStreamLen = ReadPrimaryHintStreamLength(); |
| 4504 if (nStreamOffset < 0 || nStreamLen < 1) | 4379 if (nStreamOffset < 0 || nStreamLen < 1) |
| 4505 return FALSE; | 4380 return FALSE; |
| 4506 | 4381 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4576 dwPageLenArray.Add(safePageLen.ValueOrDie()); | 4451 dwPageLenArray.Add(safePageLen.ValueOrDie()); |
| 4577 } | 4452 } |
| 4578 CPDF_Object* pOffsetE = m_pLinearizedDict->GetElementValue("E"); | 4453 CPDF_Object* pOffsetE = m_pLinearizedDict->GetElementValue("E"); |
| 4579 int nOffsetE = pOffsetE ? pOffsetE->GetInteger() : -1; | 4454 int nOffsetE = pOffsetE ? pOffsetE->GetInteger() : -1; |
| 4580 if (nOffsetE < 0) | 4455 if (nOffsetE < 0) |
| 4581 return FALSE; | 4456 return FALSE; |
| 4582 CPDF_Object* pFirstPageNum = m_pLinearizedDict->GetElementValue("P"); | 4457 CPDF_Object* pFirstPageNum = m_pLinearizedDict->GetElementValue("P"); |
| 4583 int nFirstPageNum = pFirstPageNum ? pFirstPageNum->GetInteger() : 0; | 4458 int nFirstPageNum = pFirstPageNum ? pFirstPageNum->GetInteger() : 0; |
| 4584 for (int i = 0; i < nPages; ++i) { | 4459 for (int i = 0; i < nPages; ++i) { |
| 4585 if (i == nFirstPageNum) { | 4460 if (i == nFirstPageNum) { |
| 4586 m_szPageOffsetArray.Add(m_szFirstPageObjOffset); | 4461 m_szPageOffsetArray.push_back(m_szFirstPageObjOffset); |
| 4587 } else if (i == nFirstPageNum + 1) { | 4462 } else if (i == nFirstPageNum + 1) { |
| 4588 if (i == 1) { | 4463 if (i == 1) { |
| 4589 m_szPageOffsetArray.Add(nOffsetE); | 4464 m_szPageOffsetArray.push_back(nOffsetE); |
| 4590 } else { | 4465 } else { |
| 4591 m_szPageOffsetArray.Add(m_szPageOffsetArray[i - 2] + | 4466 m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 2] + |
| 4592 dwPageLenArray[i - 2]); | 4467 dwPageLenArray[i - 2]); |
| 4593 } | 4468 } |
| 4594 } else { | 4469 } else { |
| 4595 if (i == 0) { | 4470 if (i == 0) { |
| 4596 m_szPageOffsetArray.Add(nOffsetE); | 4471 m_szPageOffsetArray.push_back(nOffsetE); |
| 4597 } else { | 4472 } else { |
| 4598 m_szPageOffsetArray.Add(m_szPageOffsetArray[i - 1] + | 4473 m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 1] + |
| 4599 dwPageLenArray[i - 1]); | 4474 dwPageLenArray[i - 1]); |
| 4600 } | 4475 } |
| 4601 } | 4476 } |
| 4602 } | 4477 } |
| 4603 if (nPages > 0) { | 4478 if (nPages > 0) { |
| 4604 m_szPageOffsetArray.Add(m_szPageOffsetArray[nPages - 1] + | 4479 m_szPageOffsetArray.push_back(m_szPageOffsetArray[nPages - 1] + |
| 4605 dwPageLenArray[nPages - 1]); | 4480 dwPageLenArray[nPages - 1]); |
| 4606 } | 4481 } |
| 4607 hStream->ByteAlign(); | 4482 hStream->ByteAlign(); |
| 4608 | 4483 |
| 4609 // number of shared objects | 4484 // number of shared objects |
| 4610 required_bits = dwSharedObjBits; | 4485 required_bits = dwSharedObjBits; |
| 4611 required_bits *= pdfium::base::checked_cast<FX_DWORD>(nPages); | 4486 required_bits *= pdfium::base::checked_cast<FX_DWORD>(nPages); |
| 4612 if (!CanReadFromBitStream(hStream, required_bits)) | 4487 if (!CanReadFromBitStream(hStream, required_bits)) |
| 4613 return FALSE; | 4488 return FALSE; |
| 4614 for (int i = 0; i < nPages; i++) { | 4489 for (int i = 0; i < nPages; i++) { |
| 4615 m_dwNSharedObjsArray.Add(hStream->GetBits(dwSharedObjBits)); | 4490 m_dwNSharedObjsArray.Add(hStream->GetBits(dwSharedObjBits)); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4697 for (int i = 0; i < dwSharedObjTotal; ++i) { | 4572 for (int i = 0; i < dwSharedObjTotal; ++i) { |
| 4698 dwPrevObjLen = dwCurObjLen; | 4573 dwPrevObjLen = dwCurObjLen; |
| 4699 FX_SAFE_DWORD safeObjLen = hStream->GetBits(dwDeltaGroupLen); | 4574 FX_SAFE_DWORD safeObjLen = hStream->GetBits(dwDeltaGroupLen); |
| 4700 safeObjLen += dwGroupLeastLen; | 4575 safeObjLen += dwGroupLeastLen; |
| 4701 if (!safeObjLen.IsValid()) | 4576 if (!safeObjLen.IsValid()) |
| 4702 return FALSE; | 4577 return FALSE; |
| 4703 dwCurObjLen = safeObjLen.ValueOrDie(); | 4578 dwCurObjLen = safeObjLen.ValueOrDie(); |
| 4704 if (i < m_nFirstPageSharedObjs) { | 4579 if (i < m_nFirstPageSharedObjs) { |
| 4705 m_dwSharedObjNumArray.Add(nFirstPageObjNum + i); | 4580 m_dwSharedObjNumArray.Add(nFirstPageObjNum + i); |
| 4706 if (i == 0) | 4581 if (i == 0) |
| 4707 m_szSharedObjOffsetArray.Add(m_szFirstPageObjOffset); | 4582 m_szSharedObjOffsetArray.push_back(m_szFirstPageObjOffset); |
| 4708 } else { | 4583 } else { |
| 4709 FX_SAFE_DWORD safeObjNum = dwFirstSharedObjNum; | 4584 FX_SAFE_DWORD safeObjNum = dwFirstSharedObjNum; |
| 4710 safeObjNum += i - m_nFirstPageSharedObjs; | 4585 safeObjNum += i - m_nFirstPageSharedObjs; |
| 4711 if (!safeObjNum.IsValid()) | 4586 if (!safeObjNum.IsValid()) |
| 4712 return FALSE; | 4587 return FALSE; |
| 4713 m_dwSharedObjNumArray.Add(safeObjNum.ValueOrDie()); | 4588 m_dwSharedObjNumArray.Add(safeObjNum.ValueOrDie()); |
| 4714 if (i == m_nFirstPageSharedObjs) | 4589 if (i == m_nFirstPageSharedObjs) |
| 4715 m_szSharedObjOffsetArray.Add( | 4590 m_szSharedObjOffsetArray.push_back( |
| 4716 pdfium::base::checked_cast<int32_t>(dwFirstSharedObjLoc)); | 4591 pdfium::base::checked_cast<int32_t>(dwFirstSharedObjLoc)); |
| 4717 } | 4592 } |
| 4718 if (i != 0 && i != m_nFirstPageSharedObjs) { | 4593 if (i != 0 && i != m_nFirstPageSharedObjs) { |
| 4719 FX_SAFE_INT32 safeLoc = pdfium::base::checked_cast<int32_t>(dwPrevObjLen); | 4594 FX_SAFE_INT32 safeLoc = pdfium::base::checked_cast<int32_t>(dwPrevObjLen); |
| 4720 safeLoc += m_szSharedObjOffsetArray[i - 1]; | 4595 safeLoc += m_szSharedObjOffsetArray[i - 1]; |
| 4721 if (!safeLoc.IsValid()) | 4596 if (!safeLoc.IsValid()) |
| 4722 return FALSE; | 4597 return FALSE; |
| 4723 m_szSharedObjOffsetArray.Add(safeLoc.ValueOrDie()); | 4598 m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie()); |
| 4724 } | 4599 } |
| 4725 } | 4600 } |
| 4726 if (dwSharedObjTotal > 0) { | 4601 if (dwSharedObjTotal > 0) { |
| 4727 FX_SAFE_INT32 safeLoc = pdfium::base::checked_cast<int32_t>(dwCurObjLen); | 4602 FX_SAFE_INT32 safeLoc = pdfium::base::checked_cast<int32_t>(dwCurObjLen); |
| 4728 safeLoc += m_szSharedObjOffsetArray[dwSharedObjTotal - 1]; | 4603 safeLoc += m_szSharedObjOffsetArray[dwSharedObjTotal - 1]; |
| 4729 if (!safeLoc.IsValid()) | 4604 if (!safeLoc.IsValid()) |
| 4730 return FALSE; | 4605 return FALSE; |
| 4731 m_szSharedObjOffsetArray.Add(safeLoc.ValueOrDie()); | 4606 m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie()); |
| 4732 } | 4607 } |
| 4733 hStream->ByteAlign(); | 4608 hStream->ByteAlign(); |
| 4734 if (hStream->BitsRemaining() < dwSharedObjTotal) | 4609 if (hStream->BitsRemaining() < dwSharedObjTotal) |
| 4735 return FALSE; | 4610 return FALSE; |
| 4736 hStream->SkipBits(dwSharedObjTotal); | 4611 hStream->SkipBits(dwSharedObjTotal); |
| 4737 hStream->ByteAlign(); | 4612 hStream->ByteAlign(); |
| 4738 return TRUE; | 4613 return TRUE; |
| 4739 } | 4614 } |
| 4740 FX_BOOL CPDF_HintTables::GetPagePos(int index, | 4615 FX_BOOL CPDF_HintTables::GetPagePos(int index, |
| 4741 FX_FILESIZE& szPageStartPos, | 4616 FX_FILESIZE& szPageStartPos, |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4852 if (!m_pLinearizedDict) | 4727 if (!m_pLinearizedDict) |
| 4853 return -1; | 4728 return -1; |
| 4854 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); | 4729 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); |
| 4855 if (!pRange) | 4730 if (!pRange) |
| 4856 return -1; | 4731 return -1; |
| 4857 CPDF_Object* pStreamLen = pRange->GetElementValue(1); | 4732 CPDF_Object* pStreamLen = pRange->GetElementValue(1); |
| 4858 if (!pStreamLen) | 4733 if (!pStreamLen) |
| 4859 return -1; | 4734 return -1; |
| 4860 return pStreamLen->GetInteger(); | 4735 return pStreamLen->GetInteger(); |
| 4861 } | 4736 } |
| OLD | NEW |