OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fpdfapi/fpdf_parser/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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 SetEncryptDictionary(nullptr); | 260 SetEncryptDictionary(nullptr); |
261 | 261 |
262 if (!m_pTrailer) | 262 if (!m_pTrailer) |
263 return FORMAT_ERROR; | 263 return FORMAT_ERROR; |
264 | 264 |
265 CPDF_Object* pEncryptObj = m_pTrailer->GetObjectBy("Encrypt"); | 265 CPDF_Object* pEncryptObj = m_pTrailer->GetObjectBy("Encrypt"); |
266 if (pEncryptObj) { | 266 if (pEncryptObj) { |
267 if (CPDF_Dictionary* pEncryptDict = pEncryptObj->AsDictionary()) { | 267 if (CPDF_Dictionary* pEncryptDict = pEncryptObj->AsDictionary()) { |
268 SetEncryptDictionary(pEncryptDict); | 268 SetEncryptDictionary(pEncryptDict); |
269 } else if (CPDF_Reference* pRef = pEncryptObj->AsReference()) { | 269 } else if (CPDF_Reference* pRef = pEncryptObj->AsReference()) { |
270 pEncryptObj = m_pDocument->GetIndirectObject(pRef->GetRefObjNum()); | 270 pEncryptObj = m_pDocument->GetIndirectObjectIfValid(pRef->GetRefObjNum()); |
271 if (pEncryptObj) | 271 if (pEncryptObj) |
272 SetEncryptDictionary(pEncryptObj->GetDict()); | 272 SetEncryptDictionary(pEncryptObj->GetDict()); |
273 } | 273 } |
274 } | 274 } |
275 | 275 |
276 if (m_pEncryptDict) { | 276 if (m_pEncryptDict) { |
277 CFX_ByteString filter = m_pEncryptDict->GetStringBy("Filter"); | 277 CFX_ByteString filter = m_pEncryptDict->GetStringBy("Filter"); |
278 std::unique_ptr<CPDF_SecurityHandler> pSecurityHandler; | 278 std::unique_ptr<CPDF_SecurityHandler> pSecurityHandler; |
279 Error err = HANDLER_ERROR; | 279 Error err = HANDLER_ERROR; |
280 if (filter == "Standard") { | 280 if (filter == "Standard") { |
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
975 } | 975 } |
976 | 976 |
977 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) { | 977 FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) { |
978 CPDF_Object* pObject = ParseIndirectObjectAt(m_pDocument.get(), *pos, 0); | 978 CPDF_Object* pObject = ParseIndirectObjectAt(m_pDocument.get(), *pos, 0); |
979 if (!pObject) | 979 if (!pObject) |
980 return FALSE; | 980 return FALSE; |
981 | 981 |
982 if (m_pDocument) { | 982 if (m_pDocument) { |
983 CPDF_Dictionary* pRootDict = m_pDocument->GetRoot(); | 983 CPDF_Dictionary* pRootDict = m_pDocument->GetRoot(); |
984 if (pRootDict && pRootDict->GetObjNum() == pObject->m_ObjNum) { | 984 if (pRootDict && pRootDict->GetObjNum() == pObject->m_ObjNum) { |
| 985 // If |pObject| has an objnum assigned then this will leak as Release() |
| 986 // will early exit. |
985 if (pObject->IsStream()) | 987 if (pObject->IsStream()) |
986 pObject->Release(); | 988 pObject->Release(); |
987 return FALSE; | 989 return FALSE; |
988 } | 990 } |
989 if (!m_pDocument->InsertIndirectObject(pObject->m_ObjNum, pObject)) | 991 if (!m_pDocument->InsertIndirectObjectIfHigherGeneration(pObject->m_ObjNum, |
| 992 pObject)) { |
990 return FALSE; | 993 return FALSE; |
| 994 } |
991 } | 995 } |
992 | 996 |
993 CPDF_Stream* pStream = pObject->AsStream(); | 997 CPDF_Stream* pStream = pObject->AsStream(); |
994 if (!pStream) | 998 if (!pStream) |
995 return FALSE; | 999 return FALSE; |
996 | 1000 |
997 CPDF_Dictionary* pDict = pStream->GetDict(); | 1001 CPDF_Dictionary* pDict = pStream->GetDict(); |
998 *pos = pDict->GetIntegerBy("Prev"); | 1002 *pos = pDict->GetIntegerBy("Prev"); |
999 int32_t size = pDict->GetIntegerBy("Size"); | 1003 int32_t size = pDict->GetIntegerBy("Size"); |
1000 if (size < 0) { | 1004 if (size < 0) { |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1223 } | 1227 } |
1224 | 1228 |
1225 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(uint32_t objnum) { | 1229 CPDF_StreamAcc* CPDF_Parser::GetObjectStream(uint32_t objnum) { |
1226 auto it = m_ObjectStreamMap.find(objnum); | 1230 auto it = m_ObjectStreamMap.find(objnum); |
1227 if (it != m_ObjectStreamMap.end()) | 1231 if (it != m_ObjectStreamMap.end()) |
1228 return it->second.get(); | 1232 return it->second.get(); |
1229 | 1233 |
1230 if (!m_pDocument) | 1234 if (!m_pDocument) |
1231 return nullptr; | 1235 return nullptr; |
1232 | 1236 |
1233 const CPDF_Stream* pStream = ToStream(m_pDocument->GetIndirectObject(objnum)); | 1237 const CPDF_Stream* pStream = |
| 1238 ToStream(m_pDocument->GetIndirectObjectIfValid(objnum)); |
1234 if (!pStream) | 1239 if (!pStream) |
1235 return nullptr; | 1240 return nullptr; |
1236 | 1241 |
1237 CPDF_StreamAcc* pStreamAcc = new CPDF_StreamAcc; | 1242 CPDF_StreamAcc* pStreamAcc = new CPDF_StreamAcc; |
1238 pStreamAcc->LoadAllData(pStream); | 1243 pStreamAcc->LoadAllData(pStream); |
1239 m_ObjectStreamMap[objnum].reset(pStreamAcc); | 1244 m_ObjectStreamMap[objnum].reset(pStreamAcc); |
1240 return pStreamAcc; | 1245 return pStreamAcc; |
1241 } | 1246 } |
1242 | 1247 |
1243 FX_FILESIZE CPDF_Parser::GetObjectSize(uint32_t objnum) const { | 1248 FX_FILESIZE CPDF_Parser::GetObjectSize(uint32_t objnum) const { |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1671 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && | 1676 if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && |
1672 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { | 1677 !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { |
1673 m_LastXRefOffset = 0; | 1678 m_LastXRefOffset = 0; |
1674 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; | 1679 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; |
1675 return FORMAT_ERROR; | 1680 return FORMAT_ERROR; |
1676 } | 1681 } |
1677 | 1682 |
1678 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; | 1683 m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; |
1679 return SUCCESS; | 1684 return SUCCESS; |
1680 } | 1685 } |
OLD | NEW |