OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fpdfapi/parser/cpdf_parser.h" | 7 #include "core/fpdfapi/parser/cpdf_parser.h" |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 m_pTrailer->Release(); | 65 m_pTrailer->Release(); |
66 | 66 |
67 ReleaseEncryptHandler(); | 67 ReleaseEncryptHandler(); |
68 SetEncryptDictionary(nullptr); | 68 SetEncryptDictionary(nullptr); |
69 | 69 |
70 if (m_bOwnFileRead && m_pSyntax->m_pFileAccess) { | 70 if (m_bOwnFileRead && m_pSyntax->m_pFileAccess) { |
71 m_pSyntax->m_pFileAccess->Release(); | 71 m_pSyntax->m_pFileAccess->Release(); |
72 m_pSyntax->m_pFileAccess = nullptr; | 72 m_pSyntax->m_pFileAccess = nullptr; |
73 } | 73 } |
74 | 74 |
75 int32_t iLen = m_Trailers.GetSize(); | 75 for (CPDF_Dictionary* trailer : m_Trailers) { |
76 for (int32_t i = 0; i < iLen; ++i) { | 76 if (trailer) |
77 if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i)) | |
78 trailer->Release(); | 77 trailer->Release(); |
79 } | 78 } |
80 | 79 |
81 if (m_pLinearized) | 80 if (m_pLinearized) |
82 m_pLinearized->Release(); | 81 m_pLinearized->Release(); |
83 } | 82 } |
84 | 83 |
85 uint32_t CPDF_Parser::GetLastObjNum() const { | 84 uint32_t CPDF_Parser::GetLastObjNum() const { |
86 return m_ObjectInfo.empty() ? 0 : m_ObjectInfo.rbegin()->first; | 85 return m_ObjectInfo.empty() ? 0 : m_ObjectInfo.rbegin()->first; |
87 } | 86 } |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 360 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
362 LoadTrailerV4()); | 361 LoadTrailerV4()); |
363 if (!pDict) | 362 if (!pDict) |
364 return FALSE; | 363 return FALSE; |
365 | 364 |
366 xrefpos = GetDirectInteger(pDict.get(), "Prev"); | 365 xrefpos = GetDirectInteger(pDict.get(), "Prev"); |
367 | 366 |
368 // SLOW ... | 367 // SLOW ... |
369 XRefStreamList.insert(XRefStreamList.begin(), | 368 XRefStreamList.insert(XRefStreamList.begin(), |
370 pDict->GetIntegerFor("XRefStm")); | 369 pDict->GetIntegerFor("XRefStm")); |
371 m_Trailers.Add(pDict.release()); | 370 m_Trailers.push_back(pDict.release()); |
372 } | 371 } |
373 | 372 |
374 for (size_t i = 0; i < CrossRefList.size(); ++i) { | 373 for (size_t i = 0; i < CrossRefList.size(); ++i) { |
375 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) | 374 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) |
376 return FALSE; | 375 return FALSE; |
377 if (i == 0 && !VerifyCrossRefV4()) | 376 if (i == 0 && !VerifyCrossRefV4()) |
378 return FALSE; | 377 return FALSE; |
379 } | 378 } |
380 return TRUE; | 379 return TRUE; |
381 } | 380 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 415 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
417 LoadTrailerV4()); | 416 LoadTrailerV4()); |
418 if (!pDict) | 417 if (!pDict) |
419 return FALSE; | 418 return FALSE; |
420 | 419 |
421 xrefpos = GetDirectInteger(pDict.get(), "Prev"); | 420 xrefpos = GetDirectInteger(pDict.get(), "Prev"); |
422 | 421 |
423 // SLOW ... | 422 // SLOW ... |
424 XRefStreamList.insert(XRefStreamList.begin(), | 423 XRefStreamList.insert(XRefStreamList.begin(), |
425 pDict->GetIntegerFor("XRefStm")); | 424 pDict->GetIntegerFor("XRefStm")); |
426 m_Trailers.Add(pDict.release()); | 425 m_Trailers.push_back(pDict.release()); |
427 } | 426 } |
428 | 427 |
429 for (size_t i = 1; i < CrossRefList.size(); ++i) { | 428 for (size_t i = 1; i < CrossRefList.size(); ++i) { |
430 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) | 429 if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) |
431 return FALSE; | 430 return FALSE; |
432 } | 431 } |
433 return TRUE; | 432 return TRUE; |
434 } | 433 } |
435 | 434 |
436 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, | 435 FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
985 if (size < 0) | 984 if (size < 0) |
986 return FALSE; | 985 return FALSE; |
987 | 986 |
988 CPDF_Dictionary* pNewTrailer = ToDictionary(pDict->Clone()); | 987 CPDF_Dictionary* pNewTrailer = ToDictionary(pDict->Clone()); |
989 if (bMainXRef) { | 988 if (bMainXRef) { |
990 m_pTrailer = pNewTrailer; | 989 m_pTrailer = pNewTrailer; |
991 ShrinkObjectMap(size); | 990 ShrinkObjectMap(size); |
992 for (auto& it : m_ObjectInfo) | 991 for (auto& it : m_ObjectInfo) |
993 it.second.type = 0; | 992 it.second.type = 0; |
994 } else { | 993 } else { |
995 m_Trailers.Add(pNewTrailer); | 994 m_Trailers.push_back(pNewTrailer); |
996 } | 995 } |
997 | 996 |
998 std::vector<std::pair<int32_t, int32_t>> arrIndex; | 997 std::vector<std::pair<int32_t, int32_t>> arrIndex; |
999 CPDF_Array* pArray = pDict->GetArrayFor("Index"); | 998 CPDF_Array* pArray = pDict->GetArrayFor("Index"); |
1000 if (pArray) { | 999 if (pArray) { |
1001 for (size_t i = 0; i < pArray->GetCount() / 2; i++) { | 1000 for (size_t i = 0; i < pArray->GetCount() / 2; i++) { |
1002 CPDF_Object* pStartNumObj = pArray->GetObjectAt(i * 2); | 1001 CPDF_Object* pStartNumObj = pArray->GetObjectAt(i * 2); |
1003 CPDF_Object* pCountObj = pArray->GetObjectAt(i * 2 + 1); | 1002 CPDF_Object* pCountObj = pArray->GetObjectAt(i * 2 + 1); |
1004 | 1003 |
1005 if (ToNumber(pStartNumObj) && ToNumber(pCountObj)) { | 1004 if (ToNumber(pStartNumObj) && ToNumber(pCountObj)) { |
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1619 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && | 1618 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && |
1620 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { | 1619 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { |
1621 m_LastXRefOffset = 0; | 1620 m_LastXRefOffset = 0; |
1622 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; | 1621 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; |
1623 return FORMAT_ERROR; | 1622 return FORMAT_ERROR; |
1624 } | 1623 } |
1625 | 1624 |
1626 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; | 1625 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; |
1627 return SUCCESS; | 1626 return SUCCESS; |
1628 } | 1627 } |
OLD | NEW |