OLD | NEW |
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 "editint.h" | 7 #include "editint.h" |
8 | 8 |
9 #include "core/include/fxcrt/fx_ext.h" | 9 #include "core/include/fxcrt/fx_ext.h" |
10 #include "core/include/fpdfapi/fpdf_serial.h" | 10 #include "core/include/fpdfapi/fpdf_serial.h" |
11 #include "core/include/fpdfapi/fpdf_parser.h" | 11 #include "core/include/fpdfapi/fpdf_parser.h" |
12 | 12 |
13 #define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024) | 13 #define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024) |
14 #define PDF_XREFSTREAM_MAXSIZE 10000 | 14 #define PDF_XREFSTREAM_MAXSIZE 10000 |
15 | 15 |
16 int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, | 16 int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, |
17 CFX_FileBufferArchive* pFile, | 17 CFX_FileBufferArchive* pFile, |
18 FX_FILESIZE& offset) { | 18 FX_FILESIZE& offset) { |
19 int32_t len = 0; | 19 int32_t len = 0; |
20 if (pObj == NULL) { | 20 if (!pObj) { |
21 if (pFile->AppendString(" null") < 0) { | 21 if (pFile->AppendString(" null") < 0) { |
22 return -1; | 22 return -1; |
23 } | 23 } |
24 offset += 5; | 24 offset += 5; |
25 return 1; | 25 return 1; |
26 } | 26 } |
27 switch (pObj->GetType()) { | 27 switch (pObj->GetType()) { |
28 case PDFOBJ_NULL: | 28 case PDFOBJ_NULL: |
29 if (pFile->AppendString(" null") < 0) { | 29 if (pFile->AppendString(" null") < 0) { |
30 return -1; | 30 return -1; |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 m_dwSize = 0; | 409 m_dwSize = 0; |
410 m_bNewBuf = FALSE; | 410 m_bNewBuf = FALSE; |
411 } | 411 } |
412 FX_BOOL CPDF_Encryptor::Initialize(CPDF_CryptoHandler* pHandler, | 412 FX_BOOL CPDF_Encryptor::Initialize(CPDF_CryptoHandler* pHandler, |
413 int objnum, | 413 int objnum, |
414 uint8_t* src_data, | 414 uint8_t* src_data, |
415 FX_DWORD src_size) { | 415 FX_DWORD src_size) { |
416 if (src_size == 0) { | 416 if (src_size == 0) { |
417 return TRUE; | 417 return TRUE; |
418 } | 418 } |
419 if (pHandler == NULL) { | 419 if (!pHandler) { |
420 m_pData = (uint8_t*)src_data; | 420 m_pData = (uint8_t*)src_data; |
421 m_dwSize = src_size; | 421 m_dwSize = src_size; |
422 m_bNewBuf = FALSE; | 422 m_bNewBuf = FALSE; |
423 return TRUE; | 423 return TRUE; |
424 } | 424 } |
425 m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size); | 425 m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size); |
426 m_pData = FX_Alloc(uint8_t, m_dwSize); | 426 m_pData = FX_Alloc(uint8_t, m_dwSize); |
427 pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize); | 427 pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize); |
428 m_bNewBuf = TRUE; | 428 m_bNewBuf = TRUE; |
429 return TRUE; | 429 return TRUE; |
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1064 int32_t iRet = WriteIndirectObjectToStream(pObj); | 1064 int32_t iRet = WriteIndirectObjectToStream(pObj); |
1065 if (iRet < 1) { | 1065 if (iRet < 1) { |
1066 return iRet; | 1066 return iRet; |
1067 } | 1067 } |
1068 return WriteIndirectObj(pObj->GetObjNum(), pObj); | 1068 return WriteIndirectObj(pObj->GetObjNum(), pObj); |
1069 } | 1069 } |
1070 int32_t CPDF_Creator::WriteDirectObj(FX_DWORD objnum, | 1070 int32_t CPDF_Creator::WriteDirectObj(FX_DWORD objnum, |
1071 const CPDF_Object* pObj, | 1071 const CPDF_Object* pObj, |
1072 FX_BOOL bEncrypt) { | 1072 FX_BOOL bEncrypt) { |
1073 int32_t len = 0; | 1073 int32_t len = 0; |
1074 if (pObj == NULL) { | 1074 if (!pObj) { |
1075 if (m_File.AppendString(" null") < 0) { | 1075 if (m_File.AppendString(" null") < 0) { |
1076 return -1; | 1076 return -1; |
1077 } | 1077 } |
1078 m_Offset += 5; | 1078 m_Offset += 5; |
1079 return 1; | 1079 return 1; |
1080 } | 1080 } |
1081 switch (pObj->GetType()) { | 1081 switch (pObj->GetType()) { |
1082 case PDFOBJ_NULL: | 1082 case PDFOBJ_NULL: |
1083 if (m_File.AppendString(" null") < 0) { | 1083 if (m_File.AppendString(" null") < 0) { |
1084 return -1; | 1084 return -1; |
1085 } | 1085 } |
1086 m_Offset += 5; | 1086 m_Offset += 5; |
1087 break; | 1087 break; |
1088 case PDFOBJ_BOOLEAN: | 1088 case PDFOBJ_BOOLEAN: |
1089 case PDFOBJ_NUMBER: | 1089 case PDFOBJ_NUMBER: |
1090 if (m_File.AppendString(" ") < 0) { | 1090 if (m_File.AppendString(" ") < 0) { |
1091 return -1; | 1091 return -1; |
1092 } | 1092 } |
1093 if ((len = m_File.AppendString(pObj->GetString())) < 0) { | 1093 if ((len = m_File.AppendString(pObj->GetString())) < 0) { |
1094 return -1; | 1094 return -1; |
1095 } | 1095 } |
1096 m_Offset += len + 1; | 1096 m_Offset += len + 1; |
1097 break; | 1097 break; |
1098 case PDFOBJ_STRING: { | 1098 case PDFOBJ_STRING: { |
1099 CFX_ByteString str = pObj->GetString(); | 1099 CFX_ByteString str = pObj->GetString(); |
1100 FX_BOOL bHex = pObj->AsString()->IsHex(); | 1100 FX_BOOL bHex = pObj->AsString()->IsHex(); |
1101 if (m_pCryptoHandler == NULL || !bEncrypt) { | 1101 if (!m_pCryptoHandler || !bEncrypt) { |
1102 CFX_ByteString content = PDF_EncodeString(str, bHex); | 1102 CFX_ByteString content = PDF_EncodeString(str, bHex); |
1103 if ((len = m_File.AppendString(content)) < 0) { | 1103 if ((len = m_File.AppendString(content)) < 0) { |
1104 return -1; | 1104 return -1; |
1105 } | 1105 } |
1106 m_Offset += len; | 1106 m_Offset += len; |
1107 break; | 1107 break; |
1108 } | 1108 } |
1109 CPDF_Encryptor encryptor; | 1109 CPDF_Encryptor encryptor; |
1110 encryptor.Initialize(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(), | 1110 encryptor.Initialize(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(), |
1111 str.GetLength()); | 1111 str.GetLength()); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 } | 1193 } |
1194 } | 1194 } |
1195 } | 1195 } |
1196 if (m_File.AppendString("]") < 0) { | 1196 if (m_File.AppendString("]") < 0) { |
1197 return -1; | 1197 return -1; |
1198 } | 1198 } |
1199 m_Offset += 1; | 1199 m_Offset += 1; |
1200 break; | 1200 break; |
1201 } | 1201 } |
1202 case PDFOBJ_DICTIONARY: { | 1202 case PDFOBJ_DICTIONARY: { |
1203 if (m_pCryptoHandler == NULL || pObj == m_pEncryptDict) { | 1203 if (!m_pCryptoHandler || pObj == m_pEncryptDict) { |
1204 return PDF_CreatorAppendObject(pObj, &m_File, m_Offset); | 1204 return PDF_CreatorAppendObject(pObj, &m_File, m_Offset); |
1205 } | 1205 } |
1206 if (m_File.AppendString("<<") < 0) { | 1206 if (m_File.AppendString("<<") < 0) { |
1207 return -1; | 1207 return -1; |
1208 } | 1208 } |
1209 m_Offset += 2; | 1209 m_Offset += 2; |
1210 const CPDF_Dictionary* p = pObj->AsDictionary(); | 1210 const CPDF_Dictionary* p = pObj->AsDictionary(); |
1211 FX_BOOL bSignDict = IsSignatureDict(p); | 1211 FX_BOOL bSignDict = IsSignatureDict(p); |
1212 FX_POSITION pos = p->GetStartPos(); | 1212 FX_POSITION pos = p->GetStartPos(); |
1213 while (pos) { | 1213 while (pos) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 } | 1256 } |
1257 m_ObjectOffset[objnum] = m_Offset; | 1257 m_ObjectOffset[objnum] = m_Offset; |
1258 void* valuetemp = NULL; | 1258 void* valuetemp = NULL; |
1259 FX_BOOL bExistInMap = | 1259 FX_BOOL bExistInMap = |
1260 m_pDocument->m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, valuetemp); | 1260 m_pDocument->m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, valuetemp); |
1261 FX_BOOL bObjStm = | 1261 FX_BOOL bObjStm = |
1262 (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream; | 1262 (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream; |
1263 if (m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || | 1263 if (m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || |
1264 bObjStm) { | 1264 bObjStm) { |
1265 CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); | 1265 CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); |
1266 if (pObj == NULL) { | 1266 if (!pObj) { |
1267 m_ObjectOffset[objnum] = 0; | 1267 m_ObjectOffset[objnum] = 0; |
1268 m_ObjectSize[objnum] = 0; | 1268 m_ObjectSize[objnum] = 0; |
1269 return 0; | 1269 return 0; |
1270 } | 1270 } |
1271 if (WriteIndirectObj(pObj)) { | 1271 if (WriteIndirectObj(pObj)) { |
1272 return -1; | 1272 return -1; |
1273 } | 1273 } |
1274 if (!bExistInMap) { | 1274 if (!bExistInMap) { |
1275 m_pDocument->ReleaseIndirectObject(objnum); | 1275 m_pDocument->ReleaseIndirectObject(objnum); |
1276 } | 1276 } |
1277 } else { | 1277 } else { |
1278 uint8_t* pBuffer; | 1278 uint8_t* pBuffer; |
1279 FX_DWORD size; | 1279 FX_DWORD size; |
1280 m_pParser->GetIndirectBinary(objnum, pBuffer, size); | 1280 m_pParser->GetIndirectBinary(objnum, pBuffer, size); |
1281 if (pBuffer == NULL) { | 1281 if (!pBuffer) { |
1282 return 0; | 1282 return 0; |
1283 } | 1283 } |
1284 if (m_pParser->m_V5Type[objnum] == 2) { | 1284 if (m_pParser->m_V5Type[objnum] == 2) { |
1285 if (m_pXRefStream) { | 1285 if (m_pXRefStream) { |
1286 if (WriteIndirectObjectToStream(objnum, pBuffer, size) < 0) { | 1286 if (WriteIndirectObjectToStream(objnum, pBuffer, size) < 0) { |
1287 FX_Free(pBuffer); | 1287 FX_Free(pBuffer); |
1288 return -1; | 1288 return -1; |
1289 } | 1289 } |
1290 } else { | 1290 } else { |
1291 int32_t len = m_File.AppendDWord(objnum); | 1291 int32_t len = m_File.AppendDWord(objnum); |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 break; | 1470 break; |
1471 } | 1471 } |
1472 iStart = iMid + 1; | 1472 iStart = iMid + 1; |
1473 } | 1473 } |
1474 } | 1474 } |
1475 m_NewObjNumArray.InsertAt(iFind, objbum); | 1475 m_NewObjNumArray.InsertAt(iFind, objbum); |
1476 } | 1476 } |
1477 int32_t CPDF_Creator::WriteDoc_Stage1(IFX_Pause* pPause) { | 1477 int32_t CPDF_Creator::WriteDoc_Stage1(IFX_Pause* pPause) { |
1478 FXSYS_assert(m_iStage > -1 || m_iStage < 20); | 1478 FXSYS_assert(m_iStage > -1 || m_iStage < 20); |
1479 if (m_iStage == 0) { | 1479 if (m_iStage == 0) { |
1480 if (m_pParser == NULL) { | 1480 if (!m_pParser) { |
1481 m_dwFlags &= ~FPDFCREATE_INCREMENTAL; | 1481 m_dwFlags &= ~FPDFCREATE_INCREMENTAL; |
1482 } | 1482 } |
1483 if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) { | 1483 if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) { |
1484 m_dwFlags &= ~FPDFCREATE_INCREMENTAL; | 1484 m_dwFlags &= ~FPDFCREATE_INCREMENTAL; |
1485 } | 1485 } |
1486 CPDF_Dictionary* pDict = m_pDocument->GetRoot(); | 1486 CPDF_Dictionary* pDict = m_pDocument->GetRoot(); |
1487 m_pMetadata = pDict ? pDict->GetElementValue("Metadata") : NULL; | 1487 m_pMetadata = pDict ? pDict->GetElementValue("Metadata") : NULL; |
1488 if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { | 1488 if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { |
1489 m_pXRefStream = new CPDF_XRefStream; | 1489 m_pXRefStream = new CPDF_XRefStream; |
1490 m_pXRefStream->Start(); | 1490 m_pXRefStream->Start(); |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2103 m_bNewCrypto = FALSE; | 2103 m_bNewCrypto = FALSE; |
2104 if (!m_bStandardSecurity) { | 2104 if (!m_bStandardSecurity) { |
2105 return; | 2105 return; |
2106 } | 2106 } |
2107 if (m_pEncryptDict) { | 2107 if (m_pEncryptDict) { |
2108 m_pEncryptDict->Release(); | 2108 m_pEncryptDict->Release(); |
2109 m_pEncryptDict = NULL; | 2109 m_pEncryptDict = NULL; |
2110 } | 2110 } |
2111 m_bStandardSecurity = FALSE; | 2111 m_bStandardSecurity = FALSE; |
2112 } | 2112 } |
OLD | NEW |