| Index: core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
|
| diff --git a/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
|
| index 7570a796e4abc9136506628ef673a6c0a3c12782..438c777c0ad818a9b778b434b20c3e324eefa902 100644
|
| --- a/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
|
| +++ b/core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
|
| @@ -387,14 +387,15 @@ int32_t OutputIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset) {
|
|
|
| class CPDF_FlateEncoder {
|
| public:
|
| - CPDF_FlateEncoder();
|
| + CPDF_FlateEncoder(CPDF_Stream* pStream, FX_BOOL bFlateEncode);
|
| + CPDF_FlateEncoder(const uint8_t* pBuffer,
|
| + uint32_t size,
|
| + FX_BOOL bFlateEncode,
|
| + FX_BOOL bXRefStream = FALSE);
|
| ~CPDF_FlateEncoder();
|
| - FX_BOOL Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode);
|
| - FX_BOOL Initialize(const uint8_t* pBuffer,
|
| - uint32_t size,
|
| - FX_BOOL bFlateEncode,
|
| - FX_BOOL bXRefStream = FALSE);
|
| +
|
| void CloneDict();
|
| +
|
| uint8_t* m_pData;
|
| uint32_t m_dwSize;
|
| CPDF_Dictionary* m_pDict;
|
| @@ -402,13 +403,7 @@ class CPDF_FlateEncoder {
|
| FX_BOOL m_bNewData;
|
| CPDF_StreamAcc m_Acc;
|
| };
|
| -CPDF_FlateEncoder::CPDF_FlateEncoder() {
|
| - m_pData = NULL;
|
| - m_dwSize = 0;
|
| - m_pDict = NULL;
|
| - m_bCloned = FALSE;
|
| - m_bNewData = FALSE;
|
| -}
|
| +
|
| void CPDF_FlateEncoder::CloneDict() {
|
| if (!m_bCloned) {
|
| m_pDict = ToDictionary(m_pDict->Clone());
|
| @@ -416,8 +411,13 @@ void CPDF_FlateEncoder::CloneDict() {
|
| m_bCloned = TRUE;
|
| }
|
| }
|
| -FX_BOOL CPDF_FlateEncoder::Initialize(CPDF_Stream* pStream,
|
| - FX_BOOL bFlateEncode) {
|
| +
|
| +CPDF_FlateEncoder::CPDF_FlateEncoder(CPDF_Stream* pStream, FX_BOOL bFlateEncode)
|
| + : m_pData(nullptr),
|
| + m_dwSize(0),
|
| + m_pDict(nullptr),
|
| + m_bCloned(FALSE),
|
| + m_bNewData(FALSE) {
|
| m_Acc.LoadAllData(pStream, TRUE);
|
| if ((pStream && pStream->GetDict() &&
|
| pStream->GetDict()->KeyExist("Filter")) ||
|
| @@ -436,10 +436,9 @@ FX_BOOL CPDF_FlateEncoder::Initialize(CPDF_Stream* pStream,
|
| m_dwSize = m_Acc.GetSize();
|
| m_pDict = pStream->GetDict();
|
| }
|
| - return TRUE;
|
| + return;
|
| }
|
| - m_pData = NULL;
|
| - m_dwSize = 0;
|
| +
|
| m_bNewData = TRUE;
|
| m_bCloned = TRUE;
|
| ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), m_pData, m_dwSize);
|
| @@ -447,73 +446,71 @@ FX_BOOL CPDF_FlateEncoder::Initialize(CPDF_Stream* pStream,
|
| m_pDict->SetAtInteger("Length", m_dwSize);
|
| m_pDict->SetAtName("Filter", "FlateDecode");
|
| m_pDict->RemoveAt("DecodeParms");
|
| - return TRUE;
|
| }
|
| -FX_BOOL CPDF_FlateEncoder::Initialize(const uint8_t* pBuffer,
|
| - uint32_t size,
|
| - FX_BOOL bFlateEncode,
|
| - FX_BOOL bXRefStream) {
|
| +
|
| +CPDF_FlateEncoder::CPDF_FlateEncoder(const uint8_t* pBuffer,
|
| + uint32_t size,
|
| + FX_BOOL bFlateEncode,
|
| + FX_BOOL bXRefStream)
|
| + : m_pData(nullptr),
|
| + m_dwSize(0),
|
| + m_pDict(nullptr),
|
| + m_bCloned(FALSE),
|
| + m_bNewData(FALSE) {
|
| if (!bFlateEncode) {
|
| m_pData = (uint8_t*)pBuffer;
|
| m_dwSize = size;
|
| - return TRUE;
|
| + return;
|
| }
|
| m_bNewData = TRUE;
|
| - if (bXRefStream) {
|
| + if (bXRefStream)
|
| ::FlateEncode(pBuffer, size, 12, 1, 8, 7, m_pData, m_dwSize);
|
| - } else {
|
| + else
|
| ::FlateEncode(pBuffer, size, m_pData, m_dwSize);
|
| - }
|
| - return TRUE;
|
| }
|
| +
|
| CPDF_FlateEncoder::~CPDF_FlateEncoder() {
|
| - if (m_bCloned && m_pDict) {
|
| + if (m_bCloned && m_pDict)
|
| m_pDict->Release();
|
| - }
|
| - if (m_bNewData) {
|
| + if (m_bNewData)
|
| FX_Free(m_pData);
|
| - }
|
| }
|
| +
|
| class CPDF_Encryptor {
|
| public:
|
| - CPDF_Encryptor();
|
| + CPDF_Encryptor(CPDF_CryptoHandler* pHandler,
|
| + int objnum,
|
| + uint8_t* src_data,
|
| + uint32_t src_size);
|
| ~CPDF_Encryptor();
|
| - FX_BOOL Initialize(CPDF_CryptoHandler* pHandler,
|
| - int objnum,
|
| - uint8_t* src_data,
|
| - uint32_t src_size);
|
| +
|
| uint8_t* m_pData;
|
| uint32_t m_dwSize;
|
| FX_BOOL m_bNewBuf;
|
| };
|
| -CPDF_Encryptor::CPDF_Encryptor() {
|
| - m_pData = NULL;
|
| - m_dwSize = 0;
|
| - m_bNewBuf = FALSE;
|
| -}
|
| -FX_BOOL CPDF_Encryptor::Initialize(CPDF_CryptoHandler* pHandler,
|
| - int objnum,
|
| - uint8_t* src_data,
|
| - uint32_t src_size) {
|
| - if (src_size == 0) {
|
| - return TRUE;
|
| - }
|
| +
|
| +CPDF_Encryptor::CPDF_Encryptor(CPDF_CryptoHandler* pHandler,
|
| + int objnum,
|
| + uint8_t* src_data,
|
| + uint32_t src_size)
|
| + : m_pData(nullptr), m_dwSize(0), m_bNewBuf(FALSE) {
|
| + if (src_size == 0)
|
| + return;
|
| +
|
| if (!pHandler) {
|
| m_pData = (uint8_t*)src_data;
|
| m_dwSize = src_size;
|
| - m_bNewBuf = FALSE;
|
| - return TRUE;
|
| + return;
|
| }
|
| m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size);
|
| m_pData = FX_Alloc(uint8_t, m_dwSize);
|
| pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize);
|
| m_bNewBuf = TRUE;
|
| - return TRUE;
|
| }
|
| +
|
| CPDF_Encryptor::~CPDF_Encryptor() {
|
| - if (m_bNewBuf) {
|
| + if (m_bNewBuf)
|
| FX_Free(m_pData);
|
| - }
|
| }
|
|
|
| } // namespace
|
| @@ -548,7 +545,6 @@ FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator) {
|
| return 0;
|
| }
|
| CFX_FileBufferArchive* pFile = &pCreator->m_File;
|
| - CPDF_CryptoHandler* pHandler = pCreator->m_pCryptoHandler;
|
| FX_FILESIZE ObjOffset = pCreator->m_Offset;
|
| if (!m_dwObjNum) {
|
| m_dwObjNum = ++pCreator->m_dwLastObjNum;
|
| @@ -583,7 +579,8 @@ FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator) {
|
| return -1;
|
| }
|
| offset += len + 15;
|
| - if (!pCreator->m_bCompress && !pHandler) {
|
| +
|
| + if (!pCreator->m_bCompress && !pCreator->m_pCryptoHandler) {
|
| if ((len = pFile->AppendDWord(
|
| (uint32_t)(tempBuffer.GetLength() + m_Buffer.GetLength()))) < 0) {
|
| return -1;
|
| @@ -602,12 +599,10 @@ FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator) {
|
| offset += len + tempBuffer.GetLength() + m_Buffer.GetLength();
|
| } else {
|
| tempBuffer << m_Buffer;
|
| - CPDF_FlateEncoder encoder;
|
| - encoder.Initialize(tempBuffer.GetBuffer(), tempBuffer.GetLength(),
|
| - pCreator->m_bCompress);
|
| - CPDF_Encryptor encryptor;
|
| - encryptor.Initialize(pHandler, m_dwObjNum, encoder.m_pData,
|
| - encoder.m_dwSize);
|
| + CPDF_FlateEncoder encoder(tempBuffer.GetBuffer(), tempBuffer.GetLength(),
|
| + pCreator->m_bCompress);
|
| + CPDF_Encryptor encryptor(pCreator->m_pCryptoHandler, m_dwObjNum,
|
| + encoder.m_pData, encoder.m_dwSize);
|
| if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) {
|
| return -1;
|
| }
|
| @@ -815,9 +810,8 @@ FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator,
|
| offset += len + 6;
|
| }
|
| FX_BOOL bPredictor = TRUE;
|
| - CPDF_FlateEncoder encoder;
|
| - encoder.Initialize(m_Buffer.GetBuffer(), m_Buffer.GetLength(),
|
| - pCreator->m_bCompress, bPredictor);
|
| + CPDF_FlateEncoder encoder(m_Buffer.GetBuffer(), m_Buffer.GetLength(),
|
| + pCreator->m_bCompress, bPredictor);
|
| if (pCreator->m_bCompress) {
|
| if (pFile->AppendString("/Filter /FlateDecode") < 0) {
|
| return FALSE;
|
| @@ -915,26 +909,25 @@ CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc) {
|
| m_pEncryptDict = m_pParser->GetEncryptDict();
|
| m_pCryptoHandler = m_pParser->GetCryptoHandler();
|
| } else {
|
| - m_pEncryptDict = NULL;
|
| - m_pCryptoHandler = NULL;
|
| + m_pEncryptDict = nullptr;
|
| + m_pCryptoHandler = nullptr;
|
| }
|
| m_bSecurityChanged = FALSE;
|
| - m_bStandardSecurity = FALSE;
|
| - m_pMetadata = NULL;
|
| + m_pMetadata = nullptr;
|
| m_bEncryptCloned = FALSE;
|
| m_bEncryptMetadata = FALSE;
|
| m_Offset = 0;
|
| m_iStage = -1;
|
| m_dwFlags = 0;
|
| - m_Pos = NULL;
|
| + m_Pos = nullptr;
|
| m_XrefStart = 0;
|
| - m_pXRefStream = NULL;
|
| + m_pXRefStream = nullptr;
|
| m_ObjectStreamSize = 200;
|
| m_dwLastObjNum = m_pDocument->GetLastObjNum();
|
| - m_pIDArray = NULL;
|
| + m_pIDArray = nullptr;
|
| m_FileVersion = 0;
|
| m_dwEnryptObjNum = 0;
|
| - m_bNewCrypto = FALSE;
|
| + m_bLocalCryptoHandler = FALSE;
|
| }
|
| CPDF_Creator::~CPDF_Creator() {
|
| ResetStandardSecurity();
|
| @@ -1025,14 +1018,9 @@ int32_t CPDF_Creator::AppendObjectNumberToXRef(uint32_t objnum) {
|
| int32_t CPDF_Creator::WriteStream(const CPDF_Object* pStream,
|
| uint32_t objnum,
|
| CPDF_CryptoHandler* pCrypto) {
|
| - CPDF_FlateEncoder encoder;
|
| - encoder.Initialize(const_cast<CPDF_Stream*>(pStream->AsStream()),
|
| - pStream == m_pMetadata ? FALSE : m_bCompress);
|
| - CPDF_Encryptor encryptor;
|
| - if (!encryptor.Initialize(pCrypto, objnum, encoder.m_pData,
|
| - encoder.m_dwSize)) {
|
| - return -1;
|
| - }
|
| + CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pStream->AsStream()),
|
| + pStream == m_pMetadata ? FALSE : m_bCompress);
|
| + CPDF_Encryptor encryptor(pCrypto, objnum, encoder.m_pData, encoder.m_dwSize);
|
| if ((uint32_t)encoder.m_pDict->GetIntegerBy("Length") != encryptor.m_dwSize) {
|
| encoder.CloneDict();
|
| encoder.m_pDict->SetAtInteger("Length", encryptor.m_dwSize);
|
| @@ -1067,9 +1055,9 @@ int32_t CPDF_Creator::WriteIndirectObj(uint32_t objnum,
|
|
|
| m_Offset += len;
|
| if (pObj->IsStream()) {
|
| - CPDF_CryptoHandler* pHandler = nullptr;
|
| - pHandler =
|
| - (pObj == m_pMetadata && !m_bEncryptMetadata) ? NULL : m_pCryptoHandler;
|
| + CPDF_CryptoHandler* pHandler = (pObj == m_pMetadata && !m_bEncryptMetadata)
|
| + ? nullptr
|
| + : m_pCryptoHandler;
|
| if (WriteStream(pObj, objnum, pHandler) < 0)
|
| return -1;
|
| } else {
|
| @@ -1130,9 +1118,8 @@ int32_t CPDF_Creator::WriteDirectObj(uint32_t objnum,
|
| m_Offset += len;
|
| break;
|
| }
|
| - CPDF_Encryptor encryptor;
|
| - encryptor.Initialize(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(),
|
| - str.GetLength());
|
| + CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(),
|
| + str.GetLength());
|
| CFX_ByteString content = PDF_EncodeString(
|
| CFX_ByteString((const FX_CHAR*)encryptor.m_pData, encryptor.m_dwSize),
|
| bHex);
|
| @@ -1143,12 +1130,10 @@ int32_t CPDF_Creator::WriteDirectObj(uint32_t objnum,
|
| break;
|
| }
|
| case CPDF_Object::STREAM: {
|
| - CPDF_FlateEncoder encoder;
|
| - encoder.Initialize(const_cast<CPDF_Stream*>(pObj->AsStream()),
|
| - m_bCompress);
|
| - CPDF_Encryptor encryptor;
|
| - CPDF_CryptoHandler* pHandler = m_pCryptoHandler;
|
| - encryptor.Initialize(pHandler, objnum, encoder.m_pData, encoder.m_dwSize);
|
| + CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pObj->AsStream()),
|
| + m_bCompress);
|
| + CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, encoder.m_pData,
|
| + encoder.m_dwSize);
|
| if ((uint32_t)encoder.m_pDict->GetIntegerBy("Length") !=
|
| encryptor.m_dwSize) {
|
| encoder.CloneDict();
|
| @@ -1224,12 +1209,11 @@ int32_t CPDF_Creator::WriteDirectObj(uint32_t objnum,
|
| break;
|
| }
|
| case CPDF_Object::DICTIONARY: {
|
| - if (!m_pCryptoHandler || pObj == m_pEncryptDict) {
|
| + if (!m_pCryptoHandler || pObj == m_pEncryptDict)
|
| return PDF_CreatorAppendObject(pObj, &m_File, m_Offset);
|
| - }
|
| - if (m_File.AppendString("<<") < 0) {
|
| + if (m_File.AppendString("<<") < 0)
|
| return -1;
|
| - }
|
| +
|
| m_Offset += 2;
|
| const CPDF_Dictionary* p = pObj->AsDictionary();
|
| bool bSignDict = p->IsSignatureDict();
|
| @@ -2013,12 +1997,11 @@ void CPDF_Creator::InitID(FX_BOOL bDefault) {
|
| CPDF_SecurityHandler handler;
|
| handler.OnCreate(m_pEncryptDict, m_pIDArray, user_pass.raw_str(),
|
| user_pass.GetLength(), flag);
|
| - if (m_bNewCrypto) {
|
| + if (m_bLocalCryptoHandler)
|
| delete m_pCryptoHandler;
|
| - }
|
| m_pCryptoHandler = new CPDF_CryptoHandler;
|
| m_pCryptoHandler->Init(m_pEncryptDict, &handler);
|
| - m_bNewCrypto = TRUE;
|
| + m_bLocalCryptoHandler = TRUE;
|
| m_bSecurityChanged = TRUE;
|
| }
|
| }
|
| @@ -2059,21 +2042,14 @@ FX_BOOL CPDF_Creator::SetFileVersion(int32_t fileVersion) {
|
| void CPDF_Creator::RemoveSecurity() {
|
| ResetStandardSecurity();
|
| m_bSecurityChanged = TRUE;
|
| - m_pEncryptDict = NULL;
|
| - m_pCryptoHandler = NULL;
|
| + m_pEncryptDict = nullptr;
|
| + m_pCryptoHandler = nullptr;
|
| }
|
| void CPDF_Creator::ResetStandardSecurity() {
|
| - if (m_bStandardSecurity || m_bNewCrypto) {
|
| - delete m_pCryptoHandler;
|
| - m_pCryptoHandler = NULL;
|
| - }
|
| - m_bNewCrypto = FALSE;
|
| - if (!m_bStandardSecurity) {
|
| + if (!m_bLocalCryptoHandler)
|
| return;
|
| - }
|
| - if (m_pEncryptDict) {
|
| - m_pEncryptDict->Release();
|
| - m_pEncryptDict = NULL;
|
| - }
|
| - m_bStandardSecurity = FALSE;
|
| +
|
| + delete m_pCryptoHandler;
|
| + m_pCryptoHandler = nullptr;
|
| + m_bLocalCryptoHandler = FALSE;
|
| }
|
|
|