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

Side by Side Diff: core/fpdfapi/edit/fpdf_edit_create.cpp

Issue 2510223002: Make CPDF_Dictionary use unique pointers. (Closed)
Patch Set: Plug leaks Created 4 years, 1 month 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 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/fpdfapi/edit/editint.h" 7 #include "core/fpdfapi/edit/editint.h"
8 8
9 #include <vector> 9 #include <vector>
10 10
11 #include "core/fpdfapi/edit/cpdf_creator.h" 11 #include "core/fpdfapi/edit/cpdf_creator.h"
12 #include "core/fpdfapi/parser/cpdf_array.h" 12 #include "core/fpdfapi/parser/cpdf_array.h"
13 #include "core/fpdfapi/parser/cpdf_crypto_handler.h" 13 #include "core/fpdfapi/parser/cpdf_crypto_handler.h"
14 #include "core/fpdfapi/parser/cpdf_dictionary.h" 14 #include "core/fpdfapi/parser/cpdf_dictionary.h"
15 #include "core/fpdfapi/parser/cpdf_document.h" 15 #include "core/fpdfapi/parser/cpdf_document.h"
16 #include "core/fpdfapi/parser/cpdf_name.h"
17 #include "core/fpdfapi/parser/cpdf_number.h"
16 #include "core/fpdfapi/parser/cpdf_parser.h" 18 #include "core/fpdfapi/parser/cpdf_parser.h"
17 #include "core/fpdfapi/parser/cpdf_reference.h" 19 #include "core/fpdfapi/parser/cpdf_reference.h"
18 #include "core/fpdfapi/parser/cpdf_security_handler.h" 20 #include "core/fpdfapi/parser/cpdf_security_handler.h"
19 #include "core/fpdfapi/parser/cpdf_stream.h" 21 #include "core/fpdfapi/parser/cpdf_stream.h"
20 #include "core/fpdfapi/parser/cpdf_stream_acc.h" 22 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
21 #include "core/fpdfapi/parser/cpdf_string.h" 23 #include "core/fpdfapi/parser/cpdf_string.h"
22 #include "core/fpdfapi/parser/fpdf_parser_decode.h" 24 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
23 #include "core/fxcrt/fx_ext.h" 25 #include "core/fxcrt/fx_ext.h"
24 #include "third_party/base/stl_util.h" 26 #include "third_party/base/stl_util.h"
25 27
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 break; 123 break;
122 } 124 }
123 case CPDF_Object::DICTIONARY: { 125 case CPDF_Object::DICTIONARY: {
124 if (pFile->AppendString("<<") < 0) { 126 if (pFile->AppendString("<<") < 0) {
125 return -1; 127 return -1;
126 } 128 }
127 offset += 2; 129 offset += 2;
128 const CPDF_Dictionary* p = pObj->AsDictionary(); 130 const CPDF_Dictionary* p = pObj->AsDictionary();
129 for (const auto& it : *p) { 131 for (const auto& it : *p) {
130 const CFX_ByteString& key = it.first; 132 const CFX_ByteString& key = it.first;
131 CPDF_Object* pValue = it.second; 133 CPDF_Object* pValue = it.second.get();
132 if (pFile->AppendString("/") < 0) { 134 if (pFile->AppendString("/") < 0) {
133 return -1; 135 return -1;
134 } 136 }
135 if ((len = pFile->AppendString(PDF_NameEncode(key).AsStringC())) < 0) { 137 if ((len = pFile->AppendString(PDF_NameEncode(key).AsStringC())) < 0) {
136 return -1; 138 return -1;
137 } 139 }
138 offset += len + 1; 140 offset += len + 1;
139 if (!pValue->IsInline()) { 141 if (!pValue->IsInline()) {
140 if (pFile->AppendString(" ") < 0) { 142 if (pFile->AppendString(" ") < 0) {
141 return -1; 143 return -1;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, 192 int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument,
191 CFX_FileBufferArchive* pFile, 193 CFX_FileBufferArchive* pFile,
192 CPDF_Array* pIDArray) { 194 CPDF_Array* pIDArray) {
193 FX_FILESIZE offset = 0; 195 FX_FILESIZE offset = 0;
194 int32_t len = 0; 196 int32_t len = 0;
195 CPDF_Parser* pParser = pDocument->GetParser(); 197 CPDF_Parser* pParser = pDocument->GetParser();
196 if (pParser) { 198 if (pParser) {
197 CPDF_Dictionary* p = pParser->GetTrailer(); 199 CPDF_Dictionary* p = pParser->GetTrailer();
198 for (const auto& it : *p) { 200 for (const auto& it : *p) {
199 const CFX_ByteString& key = it.first; 201 const CFX_ByteString& key = it.first;
200 CPDF_Object* pValue = it.second; 202 CPDF_Object* pValue = it.second.get();
201 if (key == "Encrypt" || key == "Size" || key == "Filter" || 203 if (key == "Encrypt" || key == "Size" || key == "Filter" ||
202 key == "Index" || key == "Length" || key == "Prev" || key == "W" || 204 key == "Index" || key == "Length" || key == "Prev" || key == "W" ||
203 key == "XRefStm" || key == "Type" || key == "ID") { 205 key == "XRefStm" || key == "Type" || key == "ID") {
204 continue; 206 continue;
205 } 207 }
206 if (key == "DecodeParms") 208 if (key == "DecodeParms")
207 continue; 209 continue;
208 210
209 if (pFile->AppendString(("/")) < 0) { 211 if (pFile->AppendString(("/")) < 0) {
210 return -1; 212 return -1;
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 m_pDict = pStream->GetDict(); 437 m_pDict = pStream->GetDict();
436 } 438 }
437 return; 439 return;
438 } 440 }
439 441
440 m_bNewData = true; 442 m_bNewData = true;
441 m_bCloned = true; 443 m_bCloned = true;
442 // TODO(thestig): Move to Init() and check return value. 444 // TODO(thestig): Move to Init() and check return value.
443 ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), &m_pData, &m_dwSize); 445 ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), &m_pData, &m_dwSize);
444 m_pDict = ToDictionary(pStream->GetDict()->Clone().release()); 446 m_pDict = ToDictionary(pStream->GetDict()->Clone().release());
445 m_pDict->SetIntegerFor("Length", m_dwSize); 447 m_pDict->SetNewFor<CPDF_Number>("Length", static_cast<int>(m_dwSize));
446 m_pDict->SetNameFor("Filter", "FlateDecode"); 448 m_pDict->SetNewFor<CPDF_Name>("Filter", "FlateDecode");
447 m_pDict->RemoveFor("DecodeParms"); 449 m_pDict->RemoveFor("DecodeParms");
448 } 450 }
449 451
450 CPDF_FlateEncoder::CPDF_FlateEncoder(const uint8_t* pBuffer, 452 CPDF_FlateEncoder::CPDF_FlateEncoder(const uint8_t* pBuffer,
451 uint32_t size, 453 uint32_t size,
452 bool bFlateEncode, 454 bool bFlateEncode,
453 bool bXRefStream) 455 bool bXRefStream)
454 : m_pData(nullptr), 456 : m_pData(nullptr),
455 m_dwSize(0), 457 m_dwSize(0),
456 m_pDict(nullptr), 458 m_pDict(nullptr),
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 } 990 }
989 int32_t CPDF_Creator::WriteStream(const CPDF_Object* pStream, 991 int32_t CPDF_Creator::WriteStream(const CPDF_Object* pStream,
990 uint32_t objnum, 992 uint32_t objnum,
991 CPDF_CryptoHandler* pCrypto) { 993 CPDF_CryptoHandler* pCrypto) {
992 CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pStream->AsStream()), 994 CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pStream->AsStream()),
993 pStream != m_pMetadata); 995 pStream != m_pMetadata);
994 CPDF_Encryptor encryptor(pCrypto, objnum, encoder.m_pData, encoder.m_dwSize); 996 CPDF_Encryptor encryptor(pCrypto, objnum, encoder.m_pData, encoder.m_dwSize);
995 if ((uint32_t)encoder.m_pDict->GetIntegerFor("Length") != 997 if ((uint32_t)encoder.m_pDict->GetIntegerFor("Length") !=
996 encryptor.m_dwSize) { 998 encryptor.m_dwSize) {
997 encoder.CloneDict(); 999 encoder.CloneDict();
998 encoder.m_pDict->SetIntegerFor("Length", encryptor.m_dwSize); 1000 encoder.m_pDict->SetNewFor<CPDF_Number>(
1001 "Length", static_cast<int>(encryptor.m_dwSize));
999 } 1002 }
1000 if (WriteDirectObj(objnum, encoder.m_pDict) < 0) { 1003 if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {
1001 return -1; 1004 return -1;
1002 } 1005 }
1003 int len = m_File.AppendString("stream\r\n"); 1006 int len = m_File.AppendString("stream\r\n");
1004 if (len < 0) { 1007 if (len < 0) {
1005 return -1; 1008 return -1;
1006 } 1009 }
1007 m_Offset += len; 1010 m_Offset += len;
1008 if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) { 1011 if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 break; 1104 break;
1102 } 1105 }
1103 case CPDF_Object::STREAM: { 1106 case CPDF_Object::STREAM: {
1104 CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pObj->AsStream()), 1107 CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pObj->AsStream()),
1105 true); 1108 true);
1106 CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, encoder.m_pData, 1109 CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, encoder.m_pData,
1107 encoder.m_dwSize); 1110 encoder.m_dwSize);
1108 if ((uint32_t)encoder.m_pDict->GetIntegerFor("Length") != 1111 if ((uint32_t)encoder.m_pDict->GetIntegerFor("Length") !=
1109 encryptor.m_dwSize) { 1112 encryptor.m_dwSize) {
1110 encoder.CloneDict(); 1113 encoder.CloneDict();
1111 encoder.m_pDict->SetIntegerFor("Length", encryptor.m_dwSize); 1114 encoder.m_pDict->SetNewFor<CPDF_Number>(
1115 "Length", static_cast<int>(encryptor.m_dwSize));
1112 } 1116 }
1113 if (WriteDirectObj(objnum, encoder.m_pDict) < 0) { 1117 if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {
1114 return -1; 1118 return -1;
1115 } 1119 }
1116 if ((len = m_File.AppendString("stream\r\n")) < 0) { 1120 if ((len = m_File.AppendString("stream\r\n")) < 0) {
1117 return -1; 1121 return -1;
1118 } 1122 }
1119 m_Offset += len; 1123 m_Offset += len;
1120 if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) { 1124 if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
1121 return -1; 1125 return -1;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1184 return PDF_CreatorAppendObject(pObj, &m_File, m_Offset); 1188 return PDF_CreatorAppendObject(pObj, &m_File, m_Offset);
1185 if (m_File.AppendString("<<") < 0) 1189 if (m_File.AppendString("<<") < 0)
1186 return -1; 1190 return -1;
1187 1191
1188 m_Offset += 2; 1192 m_Offset += 2;
1189 const CPDF_Dictionary* p = pObj->AsDictionary(); 1193 const CPDF_Dictionary* p = pObj->AsDictionary();
1190 bool bSignDict = p->IsSignatureDict(); 1194 bool bSignDict = p->IsSignatureDict();
1191 for (const auto& it : *p) { 1195 for (const auto& it : *p) {
1192 bool bSignValue = false; 1196 bool bSignValue = false;
1193 const CFX_ByteString& key = it.first; 1197 const CFX_ByteString& key = it.first;
1194 CPDF_Object* pValue = it.second; 1198 CPDF_Object* pValue = it.second.get();
1195 if (m_File.AppendString("/") < 0) { 1199 if (m_File.AppendString("/") < 0) {
1196 return -1; 1200 return -1;
1197 } 1201 }
1198 if ((len = m_File.AppendString(PDF_NameEncode(key).AsStringC())) < 0) { 1202 if ((len = m_File.AppendString(PDF_NameEncode(key).AsStringC())) < 0) {
1199 return -1; 1203 return -1;
1200 } 1204 }
1201 m_Offset += len + 1; 1205 m_Offset += len + 1;
1202 if (bSignDict && key == "Contents") { 1206 if (bSignDict && key == "Contents") {
1203 bSignValue = true; 1207 bSignValue = true;
1204 } 1208 }
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
1706 return -1; 1710 return -1;
1707 } 1711 }
1708 if (m_File.AppendString(" 0 obj <<") < 0) { 1712 if (m_File.AppendString(" 0 obj <<") < 0) {
1709 return -1; 1713 return -1;
1710 } 1714 }
1711 } 1715 }
1712 if (m_pParser) { 1716 if (m_pParser) {
1713 CPDF_Dictionary* p = m_pParser->GetTrailer(); 1717 CPDF_Dictionary* p = m_pParser->GetTrailer();
1714 for (const auto& it : *p) { 1718 for (const auto& it : *p) {
1715 const CFX_ByteString& key = it.first; 1719 const CFX_ByteString& key = it.first;
1716 CPDF_Object* pValue = it.second; 1720 CPDF_Object* pValue = it.second.get();
1717 // TODO(ochang): Consolidate with similar check in 1721 // TODO(ochang): Consolidate with similar check in
1718 // PDF_CreatorWriteTrailer. 1722 // PDF_CreatorWriteTrailer.
1719 if (key == "Encrypt" || key == "Size" || key == "Filter" || 1723 if (key == "Encrypt" || key == "Size" || key == "Filter" ||
1720 key == "Index" || key == "Length" || key == "Prev" || key == "W" || 1724 key == "Index" || key == "Length" || key == "Prev" || key == "W" ||
1721 key == "XRefStm" || key == "ID") { 1725 key == "XRefStm" || key == "ID") {
1722 continue; 1726 continue;
1723 } 1727 }
1724 if (m_File.AppendString(("/")) < 0) { 1728 if (m_File.AppendString(("/")) < 0) {
1725 return -1; 1729 return -1;
1726 } 1730 }
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
2011 m_pCryptoHandler = nullptr; 2015 m_pCryptoHandler = nullptr;
2012 } 2016 }
2013 void CPDF_Creator::ResetStandardSecurity() { 2017 void CPDF_Creator::ResetStandardSecurity() {
2014 if (!m_bLocalCryptoHandler) 2018 if (!m_bLocalCryptoHandler)
2015 return; 2019 return;
2016 2020
2017 delete m_pCryptoHandler; 2021 delete m_pCryptoHandler;
2018 m_pCryptoHandler = nullptr; 2022 m_pCryptoHandler = nullptr;
2019 m_bLocalCryptoHandler = false; 2023 m_bLocalCryptoHandler = false;
2020 } 2024 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698