Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Side by Side Diff: core/fpdfapi/fpdf_parser/cpdf_parser.cpp

Issue 1832173003: Remove FX_DWORD from core/ and delete definition (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/include/cpdf_parser.h" 7 #include "core/fpdfapi/fpdf_parser/include/cpdf_parser.h"
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 13 matching lines...) Expand all
24 #include "third_party/base/stl_util.h" 24 #include "third_party/base/stl_util.h"
25 25
26 namespace { 26 namespace {
27 27
28 // A limit on the size of the xref table. Theoretical limits are higher, but 28 // A limit on the size of the xref table. Theoretical limits are higher, but
29 // this may be large enough in practice. 29 // this may be large enough in practice.
30 const int32_t kMaxXRefSize = 1048576; 30 const int32_t kMaxXRefSize = 1048576;
31 31
32 // A limit on the maximum object number in the xref table. Theoretical limits 32 // A limit on the maximum object number in the xref table. Theoretical limits
33 // are higher, but this may be large enough in practice. 33 // are higher, but this may be large enough in practice.
34 const FX_DWORD kMaxObjectNumber = 1048576; 34 const uint32_t kMaxObjectNumber = 1048576;
35 35
36 FX_DWORD GetVarInt(const uint8_t* p, int32_t n) { 36 uint32_t GetVarInt(const uint8_t* p, int32_t n) {
37 FX_DWORD result = 0; 37 uint32_t result = 0;
38 for (int32_t i = 0; i < n; ++i) 38 for (int32_t i = 0; i < n; ++i)
39 result = result * 256 + p[i]; 39 result = result * 256 + p[i];
40 return result; 40 return result;
41 } 41 }
42 42
43 int32_t GetStreamNCount(CPDF_StreamAcc* pObjStream) { 43 int32_t GetStreamNCount(CPDF_StreamAcc* pObjStream) {
44 return pObjStream->GetDict()->GetIntegerBy("N"); 44 return pObjStream->GetDict()->GetIntegerBy("N");
45 } 45 }
46 46
47 int32_t GetStreamFirst(CPDF_StreamAcc* pObjStream) { 47 int32_t GetStreamFirst(CPDF_StreamAcc* pObjStream) {
(...skipping 12 matching lines...) Expand all
60 m_pLinearized(nullptr), 60 m_pLinearized(nullptr),
61 m_dwFirstPageNo(0), 61 m_dwFirstPageNo(0),
62 m_dwXrefStartObjNum(0) { 62 m_dwXrefStartObjNum(0) {
63 m_pSyntax.reset(new CPDF_SyntaxParser); 63 m_pSyntax.reset(new CPDF_SyntaxParser);
64 } 64 }
65 65
66 CPDF_Parser::~CPDF_Parser() { 66 CPDF_Parser::~CPDF_Parser() {
67 CloseParser(); 67 CloseParser();
68 } 68 }
69 69
70 FX_DWORD CPDF_Parser::GetLastObjNum() const { 70 uint32_t CPDF_Parser::GetLastObjNum() const {
71 return m_ObjectInfo.empty() ? 0 : m_ObjectInfo.rbegin()->first; 71 return m_ObjectInfo.empty() ? 0 : m_ObjectInfo.rbegin()->first;
72 } 72 }
73 73
74 bool CPDF_Parser::IsValidObjectNumber(FX_DWORD objnum) const { 74 bool CPDF_Parser::IsValidObjectNumber(uint32_t objnum) const {
75 return !m_ObjectInfo.empty() && objnum <= m_ObjectInfo.rbegin()->first; 75 return !m_ObjectInfo.empty() && objnum <= m_ObjectInfo.rbegin()->first;
76 } 76 }
77 77
78 FX_FILESIZE CPDF_Parser::GetObjectPositionOrZero(FX_DWORD objnum) const { 78 FX_FILESIZE CPDF_Parser::GetObjectPositionOrZero(uint32_t objnum) const {
79 auto it = m_ObjectInfo.find(objnum); 79 auto it = m_ObjectInfo.find(objnum);
80 return it != m_ObjectInfo.end() ? it->second.pos : 0; 80 return it != m_ObjectInfo.end() ? it->second.pos : 0;
81 } 81 }
82 82
83 uint8_t CPDF_Parser::GetObjectType(FX_DWORD objnum) const { 83 uint8_t CPDF_Parser::GetObjectType(uint32_t objnum) const {
84 ASSERT(IsValidObjectNumber(objnum)); 84 ASSERT(IsValidObjectNumber(objnum));
85 auto it = m_ObjectInfo.find(objnum); 85 auto it = m_ObjectInfo.find(objnum);
86 return it != m_ObjectInfo.end() ? it->second.type : 0; 86 return it != m_ObjectInfo.end() ? it->second.type : 0;
87 } 87 }
88 88
89 uint16_t CPDF_Parser::GetObjectGenNum(FX_DWORD objnum) const { 89 uint16_t CPDF_Parser::GetObjectGenNum(uint32_t objnum) const {
90 ASSERT(IsValidObjectNumber(objnum)); 90 ASSERT(IsValidObjectNumber(objnum));
91 auto it = m_ObjectInfo.find(objnum); 91 auto it = m_ObjectInfo.find(objnum);
92 return it != m_ObjectInfo.end() ? it->second.gennum : 0; 92 return it != m_ObjectInfo.end() ? it->second.gennum : 0;
93 } 93 }
94 94
95 bool CPDF_Parser::IsObjectFreeOrNull(FX_DWORD objnum) const { 95 bool CPDF_Parser::IsObjectFreeOrNull(uint32_t objnum) const {
96 uint8_t type = GetObjectType(objnum); 96 uint8_t type = GetObjectType(objnum);
97 return type == 0 || type == 255; 97 return type == 0 || type == 255;
98 } 98 }
99 99
100 void CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict) { 100 void CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict) {
101 m_pEncryptDict = pDict; 101 m_pEncryptDict = pDict;
102 } 102 }
103 103
104 IPDF_CryptoHandler* CPDF_Parser::GetCryptoHandler() { 104 IPDF_CryptoHandler* CPDF_Parser::GetCryptoHandler() {
105 return m_pSyntax->m_pCryptoHandler.get(); 105 return m_pSyntax->m_pCryptoHandler.get();
106 } 106 }
107 107
108 IFX_FileRead* CPDF_Parser::GetFileAccess() const { 108 IFX_FileRead* CPDF_Parser::GetFileAccess() const {
109 return m_pSyntax->m_pFileAccess; 109 return m_pSyntax->m_pFileAccess;
110 } 110 }
111 111
112 void CPDF_Parser::ShrinkObjectMap(FX_DWORD objnum) { 112 void CPDF_Parser::ShrinkObjectMap(uint32_t objnum) {
113 if (objnum == 0) { 113 if (objnum == 0) {
114 m_ObjectInfo.clear(); 114 m_ObjectInfo.clear();
115 return; 115 return;
116 } 116 }
117 117
118 auto it = m_ObjectInfo.lower_bound(objnum); 118 auto it = m_ObjectInfo.lower_bound(objnum);
119 while (it != m_ObjectInfo.end()) { 119 while (it != m_ObjectInfo.end()) {
120 auto saved_it = it++; 120 auto saved_it = it++;
121 m_ObjectInfo.erase(saved_it); 121 m_ObjectInfo.erase(saved_it);
122 } 122 }
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 m_pSyntax->SetEncrypt(std::move(pCryptoHandler)); 295 m_pSyntax->SetEncrypt(std::move(pCryptoHandler));
296 } 296 }
297 return SUCCESS; 297 return SUCCESS;
298 } 298 }
299 299
300 void CPDF_Parser::ReleaseEncryptHandler() { 300 void CPDF_Parser::ReleaseEncryptHandler() {
301 m_pSyntax->m_pCryptoHandler.reset(); 301 m_pSyntax->m_pCryptoHandler.reset();
302 m_pSecurityHandler.reset(); 302 m_pSecurityHandler.reset();
303 } 303 }
304 304
305 FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) const { 305 FX_FILESIZE CPDF_Parser::GetObjectOffset(uint32_t objnum) const {
306 if (!IsValidObjectNumber(objnum)) 306 if (!IsValidObjectNumber(objnum))
307 return 0; 307 return 0;
308 308
309 if (GetObjectType(objnum) == 1) 309 if (GetObjectType(objnum) == 1)
310 return GetObjectPositionOrZero(objnum); 310 return GetObjectPositionOrZero(objnum);
311 311
312 if (GetObjectType(objnum) == 2) { 312 if (GetObjectType(objnum) == 2) {
313 FX_FILESIZE pos = GetObjectPositionOrZero(objnum); 313 FX_FILESIZE pos = GetObjectPositionOrZero(objnum);
314 return GetObjectPositionOrZero(pos); 314 return GetObjectPositionOrZero(pos);
315 } 315 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 } 364 }
365 365
366 for (size_t i = 0; i < CrossRefList.size(); ++i) { 366 for (size_t i = 0; i < CrossRefList.size(); ++i) {
367 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) 367 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE))
368 return FALSE; 368 return FALSE;
369 } 369 }
370 return TRUE; 370 return TRUE;
371 } 371 }
372 372
373 FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, 373 FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos,
374 FX_DWORD dwObjCount) { 374 uint32_t dwObjCount) {
375 if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) 375 if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount))
376 return FALSE; 376 return FALSE;
377 377
378 m_pTrailer = LoadTrailerV4(); 378 m_pTrailer = LoadTrailerV4();
379 if (!m_pTrailer) 379 if (!m_pTrailer)
380 return FALSE; 380 return FALSE;
381 381
382 int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size"); 382 int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size");
383 if (xrefsize == 0) 383 if (xrefsize == 0)
384 return FALSE; 384 return FALSE;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 } 417 }
418 418
419 for (size_t i = 1; i < CrossRefList.size(); ++i) { 419 for (size_t i = 1; i < CrossRefList.size(); ++i) {
420 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) 420 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE))
421 return FALSE; 421 return FALSE;
422 } 422 }
423 return TRUE; 423 return TRUE;
424 } 424 }
425 425
426 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, 426 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos,
427 FX_DWORD dwObjCount) { 427 uint32_t dwObjCount) {
428 FX_FILESIZE dwStartPos = pos - m_pSyntax->m_HeaderOffset; 428 FX_FILESIZE dwStartPos = pos - m_pSyntax->m_HeaderOffset;
429 429
430 m_pSyntax->RestorePos(dwStartPos); 430 m_pSyntax->RestorePos(dwStartPos);
431 m_SortedOffset.insert(pos); 431 m_SortedOffset.insert(pos);
432 432
433 FX_DWORD start_objnum = 0; 433 uint32_t start_objnum = 0;
434 FX_DWORD count = dwObjCount; 434 uint32_t count = dwObjCount;
435 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); 435 FX_FILESIZE SavedPos = m_pSyntax->SavePos();
436 436
437 const int32_t recordsize = 20; 437 const int32_t recordsize = 20;
438 std::vector<char> buf(1024 * recordsize + 1); 438 std::vector<char> buf(1024 * recordsize + 1);
439 buf[1024 * recordsize] = '\0'; 439 buf[1024 * recordsize] = '\0';
440 440
441 int32_t nBlocks = count / 1024 + 1; 441 int32_t nBlocks = count / 1024 + 1;
442 for (int32_t block = 0; block < nBlocks; block++) { 442 for (int32_t block = 0; block < nBlocks; block++) {
443 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; 443 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024;
444 FX_DWORD dwReadSize = block_size * recordsize; 444 uint32_t dwReadSize = block_size * recordsize;
445 if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_pSyntax->m_FileLen) 445 if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_pSyntax->m_FileLen)
446 return FALSE; 446 return FALSE;
447 447
448 if (!m_pSyntax->ReadBlock(reinterpret_cast<uint8_t*>(buf.data()), 448 if (!m_pSyntax->ReadBlock(reinterpret_cast<uint8_t*>(buf.data()),
449 dwReadSize)) { 449 dwReadSize)) {
450 return FALSE; 450 return FALSE;
451 } 451 }
452 452
453 for (int32_t i = 0; i < block_size; i++) { 453 for (int32_t i = 0; i < block_size; i++) {
454 FX_DWORD objnum = start_objnum + block * 1024 + i; 454 uint32_t objnum = start_objnum + block * 1024 + i;
455 char* pEntry = &buf[i * recordsize]; 455 char* pEntry = &buf[i * recordsize];
456 if (pEntry[17] == 'f') { 456 if (pEntry[17] == 'f') {
457 m_ObjectInfo[objnum].pos = 0; 457 m_ObjectInfo[objnum].pos = 0;
458 m_ObjectInfo[objnum].type = 0; 458 m_ObjectInfo[objnum].type = 0;
459 } else { 459 } else {
460 int32_t offset = FXSYS_atoi(pEntry); 460 int32_t offset = FXSYS_atoi(pEntry);
461 if (offset == 0) { 461 if (offset == 0) {
462 for (int32_t c = 0; c < 10; c++) { 462 for (int32_t c = 0; c < 10; c++) {
463 if (!std::isdigit(pEntry[c])) 463 if (!std::isdigit(pEntry[c]))
464 return FALSE; 464 return FALSE;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 bool bIsNumber; 498 bool bIsNumber;
499 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); 499 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber);
500 if (word.IsEmpty()) 500 if (word.IsEmpty())
501 return false; 501 return false;
502 502
503 if (!bIsNumber) { 503 if (!bIsNumber) {
504 m_pSyntax->RestorePos(SavedPos); 504 m_pSyntax->RestorePos(SavedPos);
505 break; 505 break;
506 } 506 }
507 507
508 FX_DWORD start_objnum = FXSYS_atoui(word); 508 uint32_t start_objnum = FXSYS_atoui(word);
509 if (start_objnum >= kMaxObjectNumber) 509 if (start_objnum >= kMaxObjectNumber)
510 return false; 510 return false;
511 511
512 FX_DWORD count = m_pSyntax->GetDirectNum(); 512 uint32_t count = m_pSyntax->GetDirectNum();
513 m_pSyntax->ToNextWord(); 513 m_pSyntax->ToNextWord();
514 SavedPos = m_pSyntax->SavePos(); 514 SavedPos = m_pSyntax->SavePos();
515 const int32_t recordsize = 20; 515 const int32_t recordsize = 20;
516 516
517 m_dwXrefStartObjNum = start_objnum; 517 m_dwXrefStartObjNum = start_objnum;
518 if (!bSkip) { 518 if (!bSkip) {
519 std::vector<char> buf(1024 * recordsize + 1); 519 std::vector<char> buf(1024 * recordsize + 1);
520 buf[1024 * recordsize] = '\0'; 520 buf[1024 * recordsize] = '\0';
521 521
522 int32_t nBlocks = count / 1024 + 1; 522 int32_t nBlocks = count / 1024 + 1;
523 for (int32_t block = 0; block < nBlocks; block++) { 523 for (int32_t block = 0; block < nBlocks; block++) {
524 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; 524 int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024;
525 m_pSyntax->ReadBlock(reinterpret_cast<uint8_t*>(buf.data()), 525 m_pSyntax->ReadBlock(reinterpret_cast<uint8_t*>(buf.data()),
526 block_size * recordsize); 526 block_size * recordsize);
527 527
528 for (int32_t i = 0; i < block_size; i++) { 528 for (int32_t i = 0; i < block_size; i++) {
529 FX_DWORD objnum = start_objnum + block * 1024 + i; 529 uint32_t objnum = start_objnum + block * 1024 + i;
530 char* pEntry = &buf[i * recordsize]; 530 char* pEntry = &buf[i * recordsize];
531 if (pEntry[17] == 'f') { 531 if (pEntry[17] == 'f') {
532 m_ObjectInfo[objnum].pos = 0; 532 m_ObjectInfo[objnum].pos = 0;
533 m_ObjectInfo[objnum].type = 0; 533 m_ObjectInfo[objnum].type = 0;
534 } else { 534 } else {
535 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); 535 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);
536 if (offset == 0) { 536 if (offset == 0) {
537 for (int32_t c = 0; c < 10; c++) { 537 for (int32_t c = 0; c < 10; c++) {
538 if (!std::isdigit(pEntry[c])) 538 if (!std::isdigit(pEntry[c]))
539 return false; 539 return false;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 m_ObjectInfo.clear(); 582 m_ObjectInfo.clear();
583 m_SortedOffset.clear(); 583 m_SortedOffset.clear();
584 if (m_pTrailer) { 584 if (m_pTrailer) {
585 m_pTrailer->Release(); 585 m_pTrailer->Release();
586 m_pTrailer = nullptr; 586 m_pTrailer = nullptr;
587 } 587 }
588 588
589 ParserState state = ParserState::kDefault; 589 ParserState state = ParserState::kDefault;
590 590
591 int32_t inside_index = 0; 591 int32_t inside_index = 0;
592 FX_DWORD objnum = 0; 592 uint32_t objnum = 0;
593 FX_DWORD gennum = 0; 593 uint32_t gennum = 0;
594 int32_t depth = 0; 594 int32_t depth = 0;
595 595
596 const FX_DWORD kBufferSize = 4096; 596 const uint32_t kBufferSize = 4096;
597 std::vector<uint8_t> buffer(kBufferSize); 597 std::vector<uint8_t> buffer(kBufferSize);
598 598
599 FX_FILESIZE pos = m_pSyntax->m_HeaderOffset; 599 FX_FILESIZE pos = m_pSyntax->m_HeaderOffset;
600 FX_FILESIZE start_pos = 0; 600 FX_FILESIZE start_pos = 0;
601 FX_FILESIZE start_pos1 = 0; 601 FX_FILESIZE start_pos1 = 0;
602 FX_FILESIZE last_obj = -1; 602 FX_FILESIZE last_obj = -1;
603 FX_FILESIZE last_xref = -1; 603 FX_FILESIZE last_xref = -1;
604 FX_FILESIZE last_trailer = -1; 604 FX_FILESIZE last_trailer = -1;
605 605
606 while (pos < m_pSyntax->m_FileLen) { 606 while (pos < m_pSyntax->m_FileLen) {
607 const FX_FILESIZE saved_pos = pos; 607 const FX_FILESIZE saved_pos = pos;
608 bool bOverFlow = false; 608 bool bOverFlow = false;
609 FX_DWORD size = 609 uint32_t size =
610 std::min((FX_DWORD)(m_pSyntax->m_FileLen - pos), kBufferSize); 610 std::min((uint32_t)(m_pSyntax->m_FileLen - pos), kBufferSize);
611 if (!m_pSyntax->m_pFileAccess->ReadBlock(buffer.data(), pos, size)) 611 if (!m_pSyntax->m_pFileAccess->ReadBlock(buffer.data(), pos, size))
612 break; 612 break;
613 613
614 for (FX_DWORD i = 0; i < size; i++) { 614 for (uint32_t i = 0; i < size; i++) {
615 uint8_t byte = buffer[i]; 615 uint8_t byte = buffer[i];
616 switch (state) { 616 switch (state) {
617 case ParserState::kDefault: 617 case ParserState::kDefault:
618 if (PDFCharIsWhitespace(byte)) { 618 if (PDFCharIsWhitespace(byte)) {
619 state = ParserState::kWhitespace; 619 state = ParserState::kWhitespace;
620 } else if (std::isdigit(byte)) { 620 } else if (std::isdigit(byte)) {
621 --i; 621 --i;
622 state = ParserState::kWhitespace; 622 state = ParserState::kWhitespace;
623 } else if (byte == '%') { 623 } else if (byte == '%') {
624 inside_index = 0; 624 inside_index = 0;
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 756
757 FX_FILESIZE offset = 0; 757 FX_FILESIZE offset = 0;
758 m_pSyntax->RestorePos(obj_pos); 758 m_pSyntax->RestorePos(obj_pos);
759 offset = m_pSyntax->FindTag("obj", 0); 759 offset = m_pSyntax->FindTag("obj", 0);
760 if (offset == -1) 760 if (offset == -1)
761 offset = 0; 761 offset = 0;
762 else 762 else
763 offset += 3; 763 offset += 3;
764 764
765 FX_FILESIZE nLen = obj_end - obj_pos - offset; 765 FX_FILESIZE nLen = obj_end - obj_pos - offset;
766 if ((FX_DWORD)nLen > size - i) { 766 if ((uint32_t)nLen > size - i) {
767 pos = obj_end + m_pSyntax->m_HeaderOffset; 767 pos = obj_end + m_pSyntax->m_HeaderOffset;
768 bOverFlow = true; 768 bOverFlow = true;
769 } else { 769 } else {
770 i += (FX_DWORD)nLen; 770 i += (uint32_t)nLen;
771 } 771 }
772 772
773 if (!m_ObjectInfo.empty() && IsValidObjectNumber(objnum) && 773 if (!m_ObjectInfo.empty() && IsValidObjectNumber(objnum) &&
774 m_ObjectInfo[objnum].pos) { 774 m_ObjectInfo[objnum].pos) {
775 if (pObject) { 775 if (pObject) {
776 FX_DWORD oldgen = GetObjectGenNum(objnum); 776 uint32_t oldgen = GetObjectGenNum(objnum);
777 m_ObjectInfo[objnum].pos = obj_pos; 777 m_ObjectInfo[objnum].pos = obj_pos;
778 m_ObjectInfo[objnum].gennum = gennum; 778 m_ObjectInfo[objnum].gennum = gennum;
779 if (oldgen != gennum) 779 if (oldgen != gennum)
780 m_bVersionUpdated = true; 780 m_bVersionUpdated = true;
781 } 781 }
782 } else { 782 } else {
783 m_ObjectInfo[objnum].pos = obj_pos; 783 m_ObjectInfo[objnum].pos = obj_pos;
784 m_ObjectInfo[objnum].type = 1; 784 m_ObjectInfo[objnum].type = 1;
785 m_ObjectInfo[objnum].gennum = gennum; 785 m_ObjectInfo[objnum].gennum = gennum;
786 } 786 }
(...skipping 25 matching lines...) Expand all
812 CPDF_Object* pRoot = pTrailer->GetElement("Root"); 812 CPDF_Object* pRoot = pTrailer->GetElement("Root");
813 CPDF_Reference* pRef = ToReference(pRoot); 813 CPDF_Reference* pRef = ToReference(pRoot);
814 if (!pRoot || 814 if (!pRoot ||
815 (pRef && IsValidObjectNumber(pRef->GetRefObjNum()) && 815 (pRef && IsValidObjectNumber(pRef->GetRefObjNum()) &&
816 m_ObjectInfo[pRef->GetRefObjNum()].pos != 0)) { 816 m_ObjectInfo[pRef->GetRefObjNum()].pos != 0)) {
817 auto it = pTrailer->begin(); 817 auto it = pTrailer->begin();
818 while (it != pTrailer->end()) { 818 while (it != pTrailer->end()) {
819 const CFX_ByteString& key = it->first; 819 const CFX_ByteString& key = it->first;
820 CPDF_Object* pElement = it->second; 820 CPDF_Object* pElement = it->second;
821 ++it; 821 ++it;
822 FX_DWORD dwObjNum = 822 uint32_t dwObjNum =
823 pElement ? pElement->GetObjNum() : 0; 823 pElement ? pElement->GetObjNum() : 0;
824 if (dwObjNum) { 824 if (dwObjNum) {
825 m_pTrailer->SetAtReference(key, m_pDocument, 825 m_pTrailer->SetAtReference(key, m_pDocument,
826 dwObjNum); 826 dwObjNum);
827 } else { 827 } else {
828 m_pTrailer->SetAt(key, pElement->Clone()); 828 m_pTrailer->SetAt(key, pElement->Clone());
829 } 829 }
830 } 830 }
831 } 831 }
832 pObj->Release(); 832 pObj->Release();
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 ShrinkObjectMap(size); 980 ShrinkObjectMap(size);
981 for (auto& it : m_ObjectInfo) 981 for (auto& it : m_ObjectInfo)
982 it.second.type = 0; 982 it.second.type = 0;
983 } else { 983 } else {
984 m_Trailers.Add(ToDictionary(pStream->GetDict()->Clone())); 984 m_Trailers.Add(ToDictionary(pStream->GetDict()->Clone()));
985 } 985 }
986 986
987 std::vector<std::pair<int32_t, int32_t>> arrIndex; 987 std::vector<std::pair<int32_t, int32_t>> arrIndex;
988 CPDF_Array* pArray = pStream->GetDict()->GetArrayBy("Index"); 988 CPDF_Array* pArray = pStream->GetDict()->GetArrayBy("Index");
989 if (pArray) { 989 if (pArray) {
990 FX_DWORD nPairSize = pArray->GetCount() / 2; 990 uint32_t nPairSize = pArray->GetCount() / 2;
991 for (FX_DWORD i = 0; i < nPairSize; i++) { 991 for (uint32_t i = 0; i < nPairSize; i++) {
992 CPDF_Object* pStartNumObj = pArray->GetElement(i * 2); 992 CPDF_Object* pStartNumObj = pArray->GetElement(i * 2);
993 CPDF_Object* pCountObj = pArray->GetElement(i * 2 + 1); 993 CPDF_Object* pCountObj = pArray->GetElement(i * 2 + 1);
994 994
995 if (ToNumber(pStartNumObj) && ToNumber(pCountObj)) { 995 if (ToNumber(pStartNumObj) && ToNumber(pCountObj)) {
996 int nStartNum = pStartNumObj->GetInteger(); 996 int nStartNum = pStartNumObj->GetInteger();
997 int nCount = pCountObj->GetInteger(); 997 int nCount = pCountObj->GetInteger();
998 if (nStartNum >= 0 && nCount > 0) 998 if (nStartNum >= 0 && nCount > 0)
999 arrIndex.push_back(std::make_pair(nStartNum, nCount)); 999 arrIndex.push_back(std::make_pair(nStartNum, nCount));
1000 } 1000 }
1001 } 1001 }
1002 } 1002 }
1003 1003
1004 if (arrIndex.size() == 0) 1004 if (arrIndex.size() == 0)
1005 arrIndex.push_back(std::make_pair(0, size)); 1005 arrIndex.push_back(std::make_pair(0, size));
1006 1006
1007 pArray = pStream->GetDict()->GetArrayBy("W"); 1007 pArray = pStream->GetDict()->GetArrayBy("W");
1008 if (!pArray) { 1008 if (!pArray) {
1009 pStream->Release(); 1009 pStream->Release();
1010 return FALSE; 1010 return FALSE;
1011 } 1011 }
1012 1012
1013 CFX_ArrayTemplate<FX_DWORD> WidthArray; 1013 CFX_ArrayTemplate<uint32_t> WidthArray;
1014 FX_SAFE_DWORD dwAccWidth = 0; 1014 FX_SAFE_DWORD dwAccWidth = 0;
1015 for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { 1015 for (uint32_t i = 0; i < pArray->GetCount(); i++) {
1016 WidthArray.Add(pArray->GetIntegerAt(i)); 1016 WidthArray.Add(pArray->GetIntegerAt(i));
1017 dwAccWidth += WidthArray[i]; 1017 dwAccWidth += WidthArray[i];
1018 } 1018 }
1019 1019
1020 if (!dwAccWidth.IsValid() || WidthArray.GetSize() < 3) { 1020 if (!dwAccWidth.IsValid() || WidthArray.GetSize() < 3) {
1021 pStream->Release(); 1021 pStream->Release();
1022 return FALSE; 1022 return FALSE;
1023 } 1023 }
1024 1024
1025 FX_DWORD totalWidth = dwAccWidth.ValueOrDie(); 1025 uint32_t totalWidth = dwAccWidth.ValueOrDie();
1026 CPDF_StreamAcc acc; 1026 CPDF_StreamAcc acc;
1027 acc.LoadAllData(pStream); 1027 acc.LoadAllData(pStream);
1028 1028
1029 const uint8_t* pData = acc.GetData(); 1029 const uint8_t* pData = acc.GetData();
1030 FX_DWORD dwTotalSize = acc.GetSize(); 1030 uint32_t dwTotalSize = acc.GetSize();
1031 FX_DWORD segindex = 0; 1031 uint32_t segindex = 0;
1032 for (FX_DWORD i = 0; i < arrIndex.size(); i++) { 1032 for (uint32_t i = 0; i < arrIndex.size(); i++) {
1033 int32_t startnum = arrIndex[i].first; 1033 int32_t startnum = arrIndex[i].first;
1034 if (startnum < 0) 1034 if (startnum < 0)
1035 continue; 1035 continue;
1036 1036
1037 m_dwXrefStartObjNum = 1037 m_dwXrefStartObjNum =
1038 pdfium::base::checked_cast<FX_DWORD, int32_t>(startnum); 1038 pdfium::base::checked_cast<uint32_t, int32_t>(startnum);
1039 FX_DWORD count = 1039 uint32_t count =
1040 pdfium::base::checked_cast<FX_DWORD, int32_t>(arrIndex[i].second); 1040 pdfium::base::checked_cast<uint32_t, int32_t>(arrIndex[i].second);
1041 FX_SAFE_DWORD dwCaculatedSize = segindex; 1041 FX_SAFE_DWORD dwCaculatedSize = segindex;
1042 dwCaculatedSize += count; 1042 dwCaculatedSize += count;
1043 dwCaculatedSize *= totalWidth; 1043 dwCaculatedSize *= totalWidth;
1044 if (!dwCaculatedSize.IsValid() || 1044 if (!dwCaculatedSize.IsValid() ||
1045 dwCaculatedSize.ValueOrDie() > dwTotalSize) { 1045 dwCaculatedSize.ValueOrDie() > dwTotalSize) {
1046 continue; 1046 continue;
1047 } 1047 }
1048 1048
1049 const uint8_t* segstart = pData + segindex * totalWidth; 1049 const uint8_t* segstart = pData + segindex * totalWidth;
1050 FX_SAFE_DWORD dwMaxObjNum = startnum; 1050 FX_SAFE_DWORD dwMaxObjNum = startnum;
1051 dwMaxObjNum += count; 1051 dwMaxObjNum += count;
1052 FX_DWORD dwV5Size = m_ObjectInfo.empty() ? 0 : GetLastObjNum() + 1; 1052 uint32_t dwV5Size = m_ObjectInfo.empty() ? 0 : GetLastObjNum() + 1;
1053 if (!dwMaxObjNum.IsValid() || dwMaxObjNum.ValueOrDie() > dwV5Size) 1053 if (!dwMaxObjNum.IsValid() || dwMaxObjNum.ValueOrDie() > dwV5Size)
1054 continue; 1054 continue;
1055 1055
1056 for (FX_DWORD j = 0; j < count; j++) { 1056 for (uint32_t j = 0; j < count; j++) {
1057 int32_t type = 1; 1057 int32_t type = 1;
1058 const uint8_t* entrystart = segstart + j * totalWidth; 1058 const uint8_t* entrystart = segstart + j * totalWidth;
1059 if (WidthArray[0]) 1059 if (WidthArray[0])
1060 type = GetVarInt(entrystart, WidthArray[0]); 1060 type = GetVarInt(entrystart, WidthArray[0]);
1061 1061
1062 if (GetObjectType(startnum + j) == 255) { 1062 if (GetObjectType(startnum + j) == 255) {
1063 FX_FILESIZE offset = 1063 FX_FILESIZE offset =
1064 GetVarInt(entrystart + WidthArray[0], WidthArray[1]); 1064 GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
1065 m_ObjectInfo[startnum + j].pos = offset; 1065 m_ObjectInfo[startnum + j].pos = offset;
1066 m_SortedOffset.insert(offset); 1066 m_SortedOffset.insert(offset);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1099 if (!pID) 1099 if (!pID)
1100 return nullptr; 1100 return nullptr;
1101 1101
1102 if (CPDF_Reference* pRef = pID->AsReference()) { 1102 if (CPDF_Reference* pRef = pID->AsReference()) {
1103 pID = ParseIndirectObject(nullptr, pRef->GetRefObjNum()); 1103 pID = ParseIndirectObject(nullptr, pRef->GetRefObjNum());
1104 m_pTrailer->SetAt("ID", pID); 1104 m_pTrailer->SetAt("ID", pID);
1105 } 1105 }
1106 return ToArray(pID); 1106 return ToArray(pID);
1107 } 1107 }
1108 1108
1109 FX_DWORD CPDF_Parser::GetRootObjNum() { 1109 uint32_t CPDF_Parser::GetRootObjNum() {
1110 CPDF_Reference* pRef = 1110 CPDF_Reference* pRef =
1111 ToReference(m_pTrailer ? m_pTrailer->GetElement("Root") : nullptr); 1111 ToReference(m_pTrailer ? m_pTrailer->GetElement("Root") : nullptr);
1112 return pRef ? pRef->GetRefObjNum() : 0; 1112 return pRef ? pRef->GetRefObjNum() : 0;
1113 } 1113 }
1114 1114
1115 FX_DWORD CPDF_Parser::GetInfoObjNum() { 1115 uint32_t CPDF_Parser::GetInfoObjNum() {
1116 CPDF_Reference* pRef = 1116 CPDF_Reference* pRef =
1117 ToReference(m_pTrailer ? m_pTrailer->GetElement("Info") : nullptr); 1117 ToReference(m_pTrailer ? m_pTrailer->GetElement("Info") : nullptr);
1118 return pRef ? pRef->GetRefObjNum() : 0; 1118 return pRef ? pRef->GetRefObjNum() : 0;
1119 } 1119 }
1120 1120
1121 FX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) { 1121 FX_BOOL CPDF_Parser::IsFormStream(uint32_t objnum, FX_BOOL& bForm) {
1122 bForm = FALSE; 1122 bForm = FALSE;
1123 if (!IsValidObjectNumber(objnum)) 1123 if (!IsValidObjectNumber(objnum))
1124 return TRUE; 1124 return TRUE;
1125 1125
1126 if (GetObjectType(objnum) == 0) 1126 if (GetObjectType(objnum) == 0)
1127 return TRUE; 1127 return TRUE;
1128 1128
1129 if (GetObjectType(objnum) == 2) 1129 if (GetObjectType(objnum) == 2)
1130 return TRUE; 1130 return TRUE;
1131 1131
(...skipping 11 matching lines...) Expand all
1143 1143
1144 const char kFormStream[] = "/Form\0stream"; 1144 const char kFormStream[] = "/Form\0stream";
1145 const CFX_ByteStringC kFormStreamStr(kFormStream, sizeof(kFormStream) - 1); 1145 const CFX_ByteStringC kFormStreamStr(kFormStream, sizeof(kFormStream) - 1);
1146 bForm = m_pSyntax->SearchMultiWord(kFormStreamStr, TRUE, size) == 0; 1146 bForm = m_pSyntax->SearchMultiWord(kFormStreamStr, TRUE, size) == 0;
1147 m_pSyntax->RestorePos(SavedPos); 1147 m_pSyntax->RestorePos(SavedPos);
1148 return TRUE; 1148 return TRUE;
1149 } 1149 }
1150 1150
1151 CPDF_Object* CPDF_Parser::ParseIndirectObject( 1151 CPDF_Object* CPDF_Parser::ParseIndirectObject(
1152 CPDF_IndirectObjectHolder* pObjList, 1152 CPDF_IndirectObjectHolder* pObjList,
1153 FX_DWORD objnum) { 1153 uint32_t objnum) {
1154 if (!IsValidObjectNumber(objnum)) 1154 if (!IsValidObjectNumber(objnum))
1155 return nullptr; 1155 return nullptr;
1156 1156
1157 // Prevent circular parsing the same object. 1157 // Prevent circular parsing the same object.
1158 if (pdfium::ContainsKey(m_ParsingObjNums, objnum)) 1158 if (pdfium::ContainsKey(m_ParsingObjNums, objnum))
1159 return nullptr; 1159 return nullptr;
1160 1160
1161 pdfium::ScopedSetInsertion<FX_DWORD> local_insert(&m_ParsingObjNums, objnum); 1161 pdfium::ScopedSetInsertion<uint32_t> local_insert(&m_ParsingObjNums, objnum);
1162 if (GetObjectType(objnum) == 1 || GetObjectType(objnum) == 255) { 1162 if (GetObjectType(objnum) == 1 || GetObjectType(objnum) == 255) {
1163 FX_FILESIZE pos = m_ObjectInfo[objnum].pos; 1163 FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
1164 if (pos <= 0) 1164 if (pos <= 0)
1165 return nullptr; 1165 return nullptr;
1166 return ParseIndirectObjectAt(pObjList, pos, objnum); 1166 return ParseIndirectObjectAt(pObjList, pos, objnum);
1167 } 1167 }
1168 if (GetObjectType(objnum) != 2) 1168 if (GetObjectType(objnum) != 2)
1169 return nullptr; 1169 return nullptr;
1170 1170
1171 CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos); 1171 CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos);
1172 if (!pObjStream) 1172 if (!pObjStream)
1173 return nullptr; 1173 return nullptr;
1174 1174
1175 ScopedFileStream file(FX_CreateMemoryStream( 1175 ScopedFileStream file(FX_CreateMemoryStream(
1176 (uint8_t*)pObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE)); 1176 (uint8_t*)pObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE));
1177 CPDF_SyntaxParser syntax; 1177 CPDF_SyntaxParser syntax;
1178 syntax.InitParser(file.get(), 0); 1178 syntax.InitParser(file.get(), 0);
1179 const int32_t offset = GetStreamFirst(pObjStream); 1179 const int32_t offset = GetStreamFirst(pObjStream);
1180 1180
1181 // Read object numbers from |pObjStream| into a cache. 1181 // Read object numbers from |pObjStream| into a cache.
1182 if (!pdfium::ContainsKey(m_ObjCache, pObjStream)) { 1182 if (!pdfium::ContainsKey(m_ObjCache, pObjStream)) {
1183 for (int32_t i = GetStreamNCount(pObjStream); i > 0; --i) { 1183 for (int32_t i = GetStreamNCount(pObjStream); i > 0; --i) {
1184 FX_DWORD thisnum = syntax.GetDirectNum(); 1184 uint32_t thisnum = syntax.GetDirectNum();
1185 FX_DWORD thisoff = syntax.GetDirectNum(); 1185 uint32_t thisoff = syntax.GetDirectNum();
1186 m_ObjCache[pObjStream][thisnum] = thisoff; 1186 m_ObjCache[pObjStream][thisnum] = thisoff;
1187 } 1187 }
1188 } 1188 }
1189 1189
1190 const auto it = m_ObjCache[pObjStream].find(objnum); 1190 const auto it = m_ObjCache[pObjStream].find(objnum);
1191 if (it == m_ObjCache[pObjStream].end()) 1191 if (it == m_ObjCache[pObjStream].end())
1192 return nullptr; 1192 return nullptr;
1193 1193
1194 syntax.RestorePos(offset + it->second); 1194 syntax.RestorePos(offset + it->second);
1195 return syntax.GetObject(pObjList, 0, 0, true); 1195 return syntax.GetObject(pObjList, 0, 0, true);
1196 } 1196 }
1197 1197
1198 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum) { 1198 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(uint32_t objnum) {
1199 auto it = m_ObjectStreamMap.find(objnum); 1199 auto it = m_ObjectStreamMap.find(objnum);
1200 if (it != m_ObjectStreamMap.end()) 1200 if (it != m_ObjectStreamMap.end())
1201 return it->second.get(); 1201 return it->second.get();
1202 1202
1203 if (!m_pDocument) 1203 if (!m_pDocument)
1204 return nullptr; 1204 return nullptr;
1205 1205
1206 const CPDF_Stream* pStream = ToStream(m_pDocument->GetIndirectObject(objnum)); 1206 const CPDF_Stream* pStream = ToStream(m_pDocument->GetIndirectObject(objnum));
1207 if (!pStream) 1207 if (!pStream)
1208 return nullptr; 1208 return nullptr;
1209 1209
1210 CPDF_StreamAcc* pStreamAcc = new CPDF_StreamAcc; 1210 CPDF_StreamAcc* pStreamAcc = new CPDF_StreamAcc;
1211 pStreamAcc->LoadAllData(pStream); 1211 pStreamAcc->LoadAllData(pStream);
1212 m_ObjectStreamMap[objnum].reset(pStreamAcc); 1212 m_ObjectStreamMap[objnum].reset(pStreamAcc);
1213 return pStreamAcc; 1213 return pStreamAcc;
1214 } 1214 }
1215 1215
1216 FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) const { 1216 FX_FILESIZE CPDF_Parser::GetObjectSize(uint32_t objnum) const {
1217 if (!IsValidObjectNumber(objnum)) 1217 if (!IsValidObjectNumber(objnum))
1218 return 0; 1218 return 0;
1219 1219
1220 if (GetObjectType(objnum) == 2) 1220 if (GetObjectType(objnum) == 2)
1221 objnum = GetObjectPositionOrZero(objnum); 1221 objnum = GetObjectPositionOrZero(objnum);
1222 1222
1223 if (GetObjectType(objnum) != 1 && GetObjectType(objnum) != 255) 1223 if (GetObjectType(objnum) != 1 && GetObjectType(objnum) != 255)
1224 return 0; 1224 return 0;
1225 1225
1226 FX_FILESIZE offset = GetObjectPositionOrZero(objnum); 1226 FX_FILESIZE offset = GetObjectPositionOrZero(objnum);
1227 if (offset == 0) 1227 if (offset == 0)
1228 return 0; 1228 return 0;
1229 1229
1230 auto it = m_SortedOffset.find(offset); 1230 auto it = m_SortedOffset.find(offset);
1231 if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end()) 1231 if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end())
1232 return 0; 1232 return 0;
1233 1233
1234 return *it - offset; 1234 return *it - offset;
1235 } 1235 }
1236 1236
1237 void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, 1237 void CPDF_Parser::GetIndirectBinary(uint32_t objnum,
1238 uint8_t*& pBuffer, 1238 uint8_t*& pBuffer,
1239 FX_DWORD& size) { 1239 uint32_t& size) {
1240 pBuffer = nullptr; 1240 pBuffer = nullptr;
1241 size = 0; 1241 size = 0;
1242 if (!IsValidObjectNumber(objnum)) 1242 if (!IsValidObjectNumber(objnum))
1243 return; 1243 return;
1244 1244
1245 if (GetObjectType(objnum) == 2) { 1245 if (GetObjectType(objnum) == 2) {
1246 CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos); 1246 CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos);
1247 if (!pObjStream) 1247 if (!pObjStream)
1248 return; 1248 return;
1249 1249
1250 int32_t offset = GetStreamFirst(pObjStream); 1250 int32_t offset = GetStreamFirst(pObjStream);
1251 const uint8_t* pData = pObjStream->GetData(); 1251 const uint8_t* pData = pObjStream->GetData();
1252 FX_DWORD totalsize = pObjStream->GetSize(); 1252 uint32_t totalsize = pObjStream->GetSize();
1253 ScopedFileStream file( 1253 ScopedFileStream file(
1254 FX_CreateMemoryStream((uint8_t*)pData, (size_t)totalsize, FALSE)); 1254 FX_CreateMemoryStream((uint8_t*)pData, (size_t)totalsize, FALSE));
1255 1255
1256 CPDF_SyntaxParser syntax; 1256 CPDF_SyntaxParser syntax;
1257 syntax.InitParser(file.get(), 0); 1257 syntax.InitParser(file.get(), 0);
1258 for (int i = GetStreamNCount(pObjStream); i > 0; --i) { 1258 for (int i = GetStreamNCount(pObjStream); i > 0; --i) {
1259 FX_DWORD thisnum = syntax.GetDirectNum(); 1259 uint32_t thisnum = syntax.GetDirectNum();
1260 FX_DWORD thisoff = syntax.GetDirectNum(); 1260 uint32_t thisoff = syntax.GetDirectNum();
1261 if (thisnum != objnum) 1261 if (thisnum != objnum)
1262 continue; 1262 continue;
1263 1263
1264 if (i == 1) { 1264 if (i == 1) {
1265 size = totalsize - (thisoff + offset); 1265 size = totalsize - (thisoff + offset);
1266 } else { 1266 } else {
1267 syntax.GetDirectNum(); // Skip nextnum. 1267 syntax.GetDirectNum(); // Skip nextnum.
1268 FX_DWORD nextoff = syntax.GetDirectNum(); 1268 uint32_t nextoff = syntax.GetDirectNum();
1269 size = nextoff - thisoff; 1269 size = nextoff - thisoff;
1270 } 1270 }
1271 1271
1272 pBuffer = FX_Alloc(uint8_t, size); 1272 pBuffer = FX_Alloc(uint8_t, size);
1273 FXSYS_memcpy(pBuffer, pData + thisoff + offset, size); 1273 FXSYS_memcpy(pBuffer, pData + thisoff + offset, size);
1274 return; 1274 return;
1275 } 1275 }
1276 return; 1276 return;
1277 } 1277 }
1278 1278
1279 if (GetObjectType(objnum) != 1) 1279 if (GetObjectType(objnum) != 1)
1280 return; 1280 return;
1281 1281
1282 FX_FILESIZE pos = m_ObjectInfo[objnum].pos; 1282 FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
1283 if (pos == 0) 1283 if (pos == 0)
1284 return; 1284 return;
1285 1285
1286 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); 1286 FX_FILESIZE SavedPos = m_pSyntax->SavePos();
1287 m_pSyntax->RestorePos(pos); 1287 m_pSyntax->RestorePos(pos);
1288 1288
1289 bool bIsNumber; 1289 bool bIsNumber;
1290 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); 1290 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber);
1291 if (!bIsNumber) { 1291 if (!bIsNumber) {
1292 m_pSyntax->RestorePos(SavedPos); 1292 m_pSyntax->RestorePos(SavedPos);
1293 return; 1293 return;
1294 } 1294 }
1295 1295
1296 FX_DWORD parser_objnum = FXSYS_atoui(word); 1296 uint32_t parser_objnum = FXSYS_atoui(word);
1297 if (parser_objnum && parser_objnum != objnum) { 1297 if (parser_objnum && parser_objnum != objnum) {
1298 m_pSyntax->RestorePos(SavedPos); 1298 m_pSyntax->RestorePos(SavedPos);
1299 return; 1299 return;
1300 } 1300 }
1301 1301
1302 word = m_pSyntax->GetNextWord(&bIsNumber); 1302 word = m_pSyntax->GetNextWord(&bIsNumber);
1303 if (!bIsNumber) { 1303 if (!bIsNumber) {
1304 m_pSyntax->RestorePos(SavedPos); 1304 m_pSyntax->RestorePos(SavedPos);
1305 return; 1305 return;
1306 } 1306 }
(...skipping 29 matching lines...) Expand all
1336 while (1) { 1336 while (1) {
1337 if (m_pSyntax->GetKeyword() == "endobj") 1337 if (m_pSyntax->GetKeyword() == "endobj")
1338 break; 1338 break;
1339 1339
1340 if (m_pSyntax->SavePos() == m_pSyntax->m_FileLen) 1340 if (m_pSyntax->SavePos() == m_pSyntax->m_FileLen)
1341 break; 1341 break;
1342 } 1342 }
1343 nextoff = m_pSyntax->SavePos(); 1343 nextoff = m_pSyntax->SavePos();
1344 } 1344 }
1345 1345
1346 size = (FX_DWORD)(nextoff - pos); 1346 size = (uint32_t)(nextoff - pos);
1347 pBuffer = FX_Alloc(uint8_t, size); 1347 pBuffer = FX_Alloc(uint8_t, size);
1348 m_pSyntax->RestorePos(pos); 1348 m_pSyntax->RestorePos(pos);
1349 m_pSyntax->ReadBlock(pBuffer, size); 1349 m_pSyntax->ReadBlock(pBuffer, size);
1350 m_pSyntax->RestorePos(SavedPos); 1350 m_pSyntax->RestorePos(SavedPos);
1351 } 1351 }
1352 1352
1353 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt( 1353 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(
1354 CPDF_IndirectObjectHolder* pObjList, 1354 CPDF_IndirectObjectHolder* pObjList,
1355 FX_FILESIZE pos, 1355 FX_FILESIZE pos,
1356 FX_DWORD objnum) { 1356 uint32_t objnum) {
1357 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); 1357 FX_FILESIZE SavedPos = m_pSyntax->SavePos();
1358 m_pSyntax->RestorePos(pos); 1358 m_pSyntax->RestorePos(pos);
1359 bool bIsNumber; 1359 bool bIsNumber;
1360 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); 1360 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber);
1361 if (!bIsNumber) { 1361 if (!bIsNumber) {
1362 m_pSyntax->RestorePos(SavedPos); 1362 m_pSyntax->RestorePos(SavedPos);
1363 return nullptr; 1363 return nullptr;
1364 } 1364 }
1365 1365
1366 FX_FILESIZE objOffset = m_pSyntax->SavePos(); 1366 FX_FILESIZE objOffset = m_pSyntax->SavePos();
1367 objOffset -= word.GetLength(); 1367 objOffset -= word.GetLength();
1368 FX_DWORD parser_objnum = FXSYS_atoui(word); 1368 uint32_t parser_objnum = FXSYS_atoui(word);
1369 if (objnum && parser_objnum != objnum) { 1369 if (objnum && parser_objnum != objnum) {
1370 m_pSyntax->RestorePos(SavedPos); 1370 m_pSyntax->RestorePos(SavedPos);
1371 return nullptr; 1371 return nullptr;
1372 } 1372 }
1373 1373
1374 word = m_pSyntax->GetNextWord(&bIsNumber); 1374 word = m_pSyntax->GetNextWord(&bIsNumber);
1375 if (!bIsNumber) { 1375 if (!bIsNumber) {
1376 m_pSyntax->RestorePos(SavedPos); 1376 m_pSyntax->RestorePos(SavedPos);
1377 return nullptr; 1377 return nullptr;
1378 } 1378 }
1379 1379
1380 FX_DWORD parser_gennum = FXSYS_atoui(word); 1380 uint32_t parser_gennum = FXSYS_atoui(word);
1381 if (m_pSyntax->GetKeyword() != "obj") { 1381 if (m_pSyntax->GetKeyword() != "obj") {
1382 m_pSyntax->RestorePos(SavedPos); 1382 m_pSyntax->RestorePos(SavedPos);
1383 return nullptr; 1383 return nullptr;
1384 } 1384 }
1385 1385
1386 CPDF_Object* pObj = 1386 CPDF_Object* pObj =
1387 m_pSyntax->GetObject(pObjList, objnum, parser_gennum, true); 1387 m_pSyntax->GetObject(pObjList, objnum, parser_gennum, true);
1388 m_pSyntax->SavePos(); 1388 m_pSyntax->SavePos();
1389 1389
1390 CFX_ByteString bsWord = m_pSyntax->GetKeyword(); 1390 CFX_ByteString bsWord = m_pSyntax->GetKeyword();
1391 if (bsWord == "endobj") 1391 if (bsWord == "endobj")
1392 m_pSyntax->SavePos(); 1392 m_pSyntax->SavePos();
1393 1393
1394 m_pSyntax->RestorePos(SavedPos); 1394 m_pSyntax->RestorePos(SavedPos);
1395 if (pObj) { 1395 if (pObj) {
1396 if (!objnum) 1396 if (!objnum)
1397 pObj->m_ObjNum = parser_objnum; 1397 pObj->m_ObjNum = parser_objnum;
1398 pObj->m_GenNum = parser_gennum; 1398 pObj->m_GenNum = parser_gennum;
1399 } 1399 }
1400 return pObj; 1400 return pObj;
1401 } 1401 }
1402 1402
1403 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( 1403 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(
1404 CPDF_IndirectObjectHolder* pObjList, 1404 CPDF_IndirectObjectHolder* pObjList,
1405 FX_FILESIZE pos, 1405 FX_FILESIZE pos,
1406 FX_DWORD objnum, 1406 uint32_t objnum,
1407 FX_FILESIZE* pResultPos) { 1407 FX_FILESIZE* pResultPos) {
1408 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); 1408 FX_FILESIZE SavedPos = m_pSyntax->SavePos();
1409 m_pSyntax->RestorePos(pos); 1409 m_pSyntax->RestorePos(pos);
1410 1410
1411 bool bIsNumber; 1411 bool bIsNumber;
1412 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); 1412 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber);
1413 if (!bIsNumber) { 1413 if (!bIsNumber) {
1414 m_pSyntax->RestorePos(SavedPos); 1414 m_pSyntax->RestorePos(SavedPos);
1415 return nullptr; 1415 return nullptr;
1416 } 1416 }
1417 1417
1418 FX_DWORD parser_objnum = FXSYS_atoui(word); 1418 uint32_t parser_objnum = FXSYS_atoui(word);
1419 if (objnum && parser_objnum != objnum) { 1419 if (objnum && parser_objnum != objnum) {
1420 m_pSyntax->RestorePos(SavedPos); 1420 m_pSyntax->RestorePos(SavedPos);
1421 return nullptr; 1421 return nullptr;
1422 } 1422 }
1423 1423
1424 word = m_pSyntax->GetNextWord(&bIsNumber); 1424 word = m_pSyntax->GetNextWord(&bIsNumber);
1425 if (!bIsNumber) { 1425 if (!bIsNumber) {
1426 m_pSyntax->RestorePos(SavedPos); 1426 m_pSyntax->RestorePos(SavedPos);
1427 return nullptr; 1427 return nullptr;
1428 } 1428 }
1429 1429
1430 FX_DWORD gennum = FXSYS_atoui(word); 1430 uint32_t gennum = FXSYS_atoui(word);
1431 if (m_pSyntax->GetKeyword() != "obj") { 1431 if (m_pSyntax->GetKeyword() != "obj") {
1432 m_pSyntax->RestorePos(SavedPos); 1432 m_pSyntax->RestorePos(SavedPos);
1433 return nullptr; 1433 return nullptr;
1434 } 1434 }
1435 1435
1436 CPDF_Object* pObj = m_pSyntax->GetObjectByStrict(pObjList, objnum, gennum); 1436 CPDF_Object* pObj = m_pSyntax->GetObjectByStrict(pObjList, objnum, gennum);
1437 if (pResultPos) 1437 if (pResultPos)
1438 *pResultPos = m_pSyntax->m_Pos; 1438 *pResultPos = m_pSyntax->m_Pos;
1439 1439
1440 m_pSyntax->RestorePos(SavedPos); 1440 m_pSyntax->RestorePos(SavedPos);
1441 return pObj; 1441 return pObj;
1442 } 1442 }
1443 1443
1444 CPDF_Dictionary* CPDF_Parser::LoadTrailerV4() { 1444 CPDF_Dictionary* CPDF_Parser::LoadTrailerV4() {
1445 if (m_pSyntax->GetKeyword() != "trailer") 1445 if (m_pSyntax->GetKeyword() != "trailer")
1446 return nullptr; 1446 return nullptr;
1447 1447
1448 std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj( 1448 std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj(
1449 m_pSyntax->GetObject(m_pDocument, 0, 0, true)); 1449 m_pSyntax->GetObject(m_pDocument, 0, 0, true));
1450 if (!ToDictionary(pObj.get())) 1450 if (!ToDictionary(pObj.get()))
1451 return nullptr; 1451 return nullptr;
1452 return pObj.release()->AsDictionary(); 1452 return pObj.release()->AsDictionary();
1453 } 1453 }
1454 1454
1455 FX_DWORD CPDF_Parser::GetPermissions(FX_BOOL bCheckRevision) { 1455 uint32_t CPDF_Parser::GetPermissions(FX_BOOL bCheckRevision) {
1456 if (!m_pSecurityHandler) 1456 if (!m_pSecurityHandler)
1457 return (FX_DWORD)-1; 1457 return (uint32_t)-1;
1458 1458
1459 FX_DWORD dwPermission = m_pSecurityHandler->GetPermissions(); 1459 uint32_t dwPermission = m_pSecurityHandler->GetPermissions();
1460 if (m_pEncryptDict && m_pEncryptDict->GetStringBy("Filter") == "Standard") { 1460 if (m_pEncryptDict && m_pEncryptDict->GetStringBy("Filter") == "Standard") {
1461 dwPermission &= 0xFFFFFFFC; 1461 dwPermission &= 0xFFFFFFFC;
1462 dwPermission |= 0xFFFFF0C0; 1462 dwPermission |= 0xFFFFF0C0;
1463 if (bCheckRevision && m_pEncryptDict->GetIntegerBy("R") == 2) 1463 if (bCheckRevision && m_pEncryptDict->GetIntegerBy("R") == 2)
1464 dwPermission &= 0xFFFFF0FF; 1464 dwPermission &= 0xFFFFF0FF;
1465 } 1465 }
1466 return dwPermission; 1466 return dwPermission;
1467 } 1467 }
1468 1468
1469 FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, 1469 FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess,
1470 FX_DWORD offset) { 1470 uint32_t offset) {
1471 m_pSyntax->InitParser(pFileAccess, offset); 1471 m_pSyntax->InitParser(pFileAccess, offset);
1472 m_pSyntax->RestorePos(m_pSyntax->m_HeaderOffset + 9); 1472 m_pSyntax->RestorePos(m_pSyntax->m_HeaderOffset + 9);
1473 1473
1474 FX_FILESIZE SavedPos = m_pSyntax->SavePos(); 1474 FX_FILESIZE SavedPos = m_pSyntax->SavePos();
1475 bool bIsNumber; 1475 bool bIsNumber;
1476 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); 1476 CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber);
1477 if (!bIsNumber) 1477 if (!bIsNumber)
1478 return FALSE; 1478 return FALSE;
1479 1479
1480 FX_DWORD objnum = FXSYS_atoui(word); 1480 uint32_t objnum = FXSYS_atoui(word);
1481 word = m_pSyntax->GetNextWord(&bIsNumber); 1481 word = m_pSyntax->GetNextWord(&bIsNumber);
1482 if (!bIsNumber) 1482 if (!bIsNumber)
1483 return FALSE; 1483 return FALSE;
1484 1484
1485 FX_DWORD gennum = FXSYS_atoui(word); 1485 uint32_t gennum = FXSYS_atoui(word);
1486 if (m_pSyntax->GetKeyword() != "obj") { 1486 if (m_pSyntax->GetKeyword() != "obj") {
1487 m_pSyntax->RestorePos(SavedPos); 1487 m_pSyntax->RestorePos(SavedPos);
1488 return FALSE; 1488 return FALSE;
1489 } 1489 }
1490 1490
1491 m_pLinearized = m_pSyntax->GetObject(nullptr, objnum, gennum, true); 1491 m_pLinearized = m_pSyntax->GetObject(nullptr, objnum, gennum, true);
1492 if (!m_pLinearized) 1492 if (!m_pLinearized)
1493 return FALSE; 1493 return FALSE;
1494 1494
1495 CPDF_Dictionary* pDict = m_pLinearized->GetDict(); 1495 CPDF_Dictionary* pDict = m_pLinearized->GetDict();
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1610 // Check for circular references. 1610 // Check for circular references.
1611 if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) 1611 if (pdfium::ContainsKey(seen_xrefpos, xrefpos))
1612 return FALSE; 1612 return FALSE;
1613 } 1613 }
1614 m_ObjectStreamMap.clear(); 1614 m_ObjectStreamMap.clear();
1615 m_bXRefStream = TRUE; 1615 m_bXRefStream = TRUE;
1616 return TRUE; 1616 return TRUE;
1617 } 1617 }
1618 1618
1619 CPDF_Parser::Error CPDF_Parser::LoadLinearizedMainXRefTable() { 1619 CPDF_Parser::Error CPDF_Parser::LoadLinearizedMainXRefTable() {
1620 FX_DWORD dwSaveMetadataObjnum = m_pSyntax->m_MetadataObjnum; 1620 uint32_t dwSaveMetadataObjnum = m_pSyntax->m_MetadataObjnum;
1621 m_pSyntax->m_MetadataObjnum = 0; 1621 m_pSyntax->m_MetadataObjnum = 0;
1622 if (m_pTrailer) { 1622 if (m_pTrailer) {
1623 m_pTrailer->Release(); 1623 m_pTrailer->Release();
1624 m_pTrailer = nullptr; 1624 m_pTrailer = nullptr;
1625 } 1625 }
1626 1626
1627 m_pSyntax->RestorePos(m_LastXRefOffset - m_pSyntax->m_HeaderOffset); 1627 m_pSyntax->RestorePos(m_LastXRefOffset - m_pSyntax->m_HeaderOffset);
1628 uint8_t ch = 0; 1628 uint8_t ch = 0;
1629 FX_DWORD dwCount = 0; 1629 uint32_t dwCount = 0;
1630 m_pSyntax->GetNextChar(ch); 1630 m_pSyntax->GetNextChar(ch);
1631 while (PDFCharIsWhitespace(ch)) { 1631 while (PDFCharIsWhitespace(ch)) {
1632 ++dwCount; 1632 ++dwCount;
1633 if (m_pSyntax->m_FileLen >= 1633 if (m_pSyntax->m_FileLen >=
1634 (FX_FILESIZE)(m_pSyntax->SavePos() + m_pSyntax->m_HeaderOffset)) { 1634 (FX_FILESIZE)(m_pSyntax->SavePos() + m_pSyntax->m_HeaderOffset)) {
1635 break; 1635 break;
1636 } 1636 }
1637 m_pSyntax->GetNextChar(ch); 1637 m_pSyntax->GetNextChar(ch);
1638 } 1638 }
1639 m_LastXRefOffset += dwCount; 1639 m_LastXRefOffset += dwCount;
1640 m_ObjectStreamMap.clear(); 1640 m_ObjectStreamMap.clear();
1641 m_ObjCache.clear(); 1641 m_ObjCache.clear();
1642 1642
1643 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && 1643 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) &&
1644 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { 1644 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) {
1645 m_LastXRefOffset = 0; 1645 m_LastXRefOffset = 0;
1646 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; 1646 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum;
1647 return FORMAT_ERROR; 1647 return FORMAT_ERROR;
1648 } 1648 }
1649 1649
1650 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; 1650 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum;
1651 return SUCCESS; 1651 return SUCCESS;
1652 } 1652 }
OLDNEW
« no previous file with comments | « core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp ('k') | core/fpdfapi/fpdf_parser/cpdf_reference.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698