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

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

Issue 2019443002: Make CPDF_IndirectObjectHolder::InsertIndirectObject return a bool. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: Fix bad refactoring Created 4 years, 7 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 961 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 m_SortedOffset.insert(last_trailer - m_pSyntax->m_HeaderOffset); 972 m_SortedOffset.insert(last_trailer - m_pSyntax->m_HeaderOffset);
973 return m_pTrailer && !m_ObjectInfo.empty(); 973 return m_pTrailer && !m_ObjectInfo.empty();
974 } 974 }
975 975
976 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) { 976 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) {
977 CPDF_Object* pObject = ParseIndirectObjectAt(m_pDocument, *pos, 0); 977 CPDF_Object* pObject = ParseIndirectObjectAt(m_pDocument, *pos, 0);
978 if (!pObject) 978 if (!pObject)
979 return FALSE; 979 return FALSE;
980 980
981 if (m_pDocument) { 981 if (m_pDocument) {
982 FX_BOOL bInserted = FALSE; 982 CPDF_Dictionary* pRootDict = m_pDocument->GetRoot();
983 CPDF_Dictionary* pDict = m_pDocument->GetRoot(); 983 if (pRootDict && pRootDict->GetObjNum() == pObject->m_ObjNum) {
984 if (!pDict || pDict->GetObjNum() != pObject->m_ObjNum) {
985 bInserted = m_pDocument->InsertIndirectObject(pObject->m_ObjNum, pObject);
986 } else {
987 if (pObject->IsStream()) 984 if (pObject->IsStream())
988 pObject->Release(); 985 pObject->Release();
986 return FALSE;
989 } 987 }
990 988 if (!m_pDocument->InsertIndirectObject(pObject->m_ObjNum, pObject))
991 if (!bInserted)
992 return FALSE; 989 return FALSE;
993 } 990 }
994 991
995 CPDF_Stream* pStream = pObject->AsStream(); 992 CPDF_Stream* pStream = pObject->AsStream();
996 if (!pStream) 993 if (!pStream)
997 return FALSE; 994 return FALSE;
998 995
999 *pos = pStream->GetDict()->GetIntegerBy("Prev"); 996 CPDF_Dictionary* pDict = pStream->GetDict();
1000 int32_t size = pStream->GetDict()->GetIntegerBy("Size"); 997 *pos = pDict->GetIntegerBy("Prev");
998 int32_t size = pDict->GetIntegerBy("Size");
1001 if (size < 0) { 999 if (size < 0) {
1002 pStream->Release(); 1000 pStream->Release();
1003 return FALSE; 1001 return FALSE;
1004 } 1002 }
1005 1003
1004 CPDF_Dictionary* pNewTrailer = ToDictionary(pDict->Clone());
1006 if (bMainXRef) { 1005 if (bMainXRef) {
1007 m_pTrailer = ToDictionary(pStream->GetDict()->Clone()); 1006 m_pTrailer = pNewTrailer;
1008 ShrinkObjectMap(size); 1007 ShrinkObjectMap(size);
1009 for (auto& it : m_ObjectInfo) 1008 for (auto& it : m_ObjectInfo)
1010 it.second.type = 0; 1009 it.second.type = 0;
1011 } else { 1010 } else {
1012 m_Trailers.Add(ToDictionary(pStream->GetDict()->Clone())); 1011 m_Trailers.Add(pNewTrailer);
1013 } 1012 }
1014 1013
1015 std::vector<std::pair<int32_t, int32_t>> arrIndex; 1014 std::vector<std::pair<int32_t, int32_t>> arrIndex;
1016 CPDF_Array* pArray = pStream->GetDict()->GetArrayBy("Index"); 1015 CPDF_Array* pArray = pDict->GetArrayBy("Index");
1017 if (pArray) { 1016 if (pArray) {
1018 for (size_t i = 0; i < pArray->GetCount() / 2; i++) { 1017 for (size_t i = 0; i < pArray->GetCount() / 2; i++) {
1019 CPDF_Object* pStartNumObj = pArray->GetObjectAt(i * 2); 1018 CPDF_Object* pStartNumObj = pArray->GetObjectAt(i * 2);
1020 CPDF_Object* pCountObj = pArray->GetObjectAt(i * 2 + 1); 1019 CPDF_Object* pCountObj = pArray->GetObjectAt(i * 2 + 1);
1021 1020
1022 if (ToNumber(pStartNumObj) && ToNumber(pCountObj)) { 1021 if (ToNumber(pStartNumObj) && ToNumber(pCountObj)) {
1023 int nStartNum = pStartNumObj->GetInteger(); 1022 int nStartNum = pStartNumObj->GetInteger();
1024 int nCount = pCountObj->GetInteger(); 1023 int nCount = pCountObj->GetInteger();
1025 if (nStartNum >= 0 && nCount > 0) 1024 if (nStartNum >= 0 && nCount > 0)
1026 arrIndex.push_back(std::make_pair(nStartNum, nCount)); 1025 arrIndex.push_back(std::make_pair(nStartNum, nCount));
1027 } 1026 }
1028 } 1027 }
1029 } 1028 }
1030 1029
1031 if (arrIndex.size() == 0) 1030 if (arrIndex.size() == 0)
1032 arrIndex.push_back(std::make_pair(0, size)); 1031 arrIndex.push_back(std::make_pair(0, size));
1033 1032
1034 pArray = pStream->GetDict()->GetArrayBy("W"); 1033 pArray = pDict->GetArrayBy("W");
1035 if (!pArray) { 1034 if (!pArray) {
1036 pStream->Release(); 1035 pStream->Release();
1037 return FALSE; 1036 return FALSE;
1038 } 1037 }
1039 1038
1040 CFX_ArrayTemplate<uint32_t> WidthArray; 1039 CFX_ArrayTemplate<uint32_t> WidthArray;
1041 FX_SAFE_UINT32 dwAccWidth = 0; 1040 FX_SAFE_UINT32 dwAccWidth = 0;
1042 for (size_t i = 0; i < pArray->GetCount(); i++) { 1041 for (size_t i = 0; i < pArray->GetCount(); ++i) {
1043 WidthArray.Add(pArray->GetIntegerAt(i)); 1042 WidthArray.Add(pArray->GetIntegerAt(i));
1044 dwAccWidth += WidthArray[i]; 1043 dwAccWidth += WidthArray[i];
1045 } 1044 }
1046 1045
1047 if (!dwAccWidth.IsValid() || WidthArray.GetSize() < 3) { 1046 if (!dwAccWidth.IsValid() || WidthArray.GetSize() < 3) {
1048 pStream->Release(); 1047 pStream->Release();
1049 return FALSE; 1048 return FALSE;
1050 } 1049 }
1051 1050
1052 uint32_t totalWidth = dwAccWidth.ValueOrDie(); 1051 uint32_t totalWidth = dwAccWidth.ValueOrDie();
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
1669 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && 1668 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) &&
1670 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { 1669 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) {
1671 m_LastXRefOffset = 0; 1670 m_LastXRefOffset = 0;
1672 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; 1671 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum;
1673 return FORMAT_ERROR; 1672 return FORMAT_ERROR;
1674 } 1673 }
1675 1674
1676 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; 1675 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum;
1677 return SUCCESS; 1676 return SUCCESS;
1678 } 1677 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698