Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
index dd416fbd57a256f5441153b46ea6c52efc9c4c52..b2f7eb6d7e670205998f30ed8e3fe363c4076a51 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
@@ -96,7 +96,6 @@ CPDF_Parser::CPDF_Parser() { |
m_pDocument = NULL; |
m_pTrailer = NULL; |
m_pEncryptDict = NULL; |
- m_pSecurityHandler = NULL; |
m_pLinearized = NULL; |
m_dwFirstPageNo = 0; |
m_dwXrefStartObjNum = 0; |
@@ -287,54 +286,46 @@ FX_DWORD CPDF_Parser::SetEncryptHandler() { |
} |
if (m_bForceUseSecurityHandler) { |
FX_DWORD err = PDFPARSE_ERROR_HANDLER; |
- if (m_pSecurityHandler == NULL) { |
+ if (!m_pSecurityHandler) { |
return PDFPARSE_ERROR_HANDLER; |
} |
if (!m_pSecurityHandler->OnInit(this, m_pEncryptDict)) { |
return err; |
} |
- CPDF_CryptoHandler* pCryptoHandler = |
- m_pSecurityHandler->CreateCryptoHandler(); |
- if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) { |
- delete pCryptoHandler; |
- pCryptoHandler = NULL; |
+ nonstd::unique_ptr<CPDF_CryptoHandler> pCryptoHandler( |
+ m_pSecurityHandler->CreateCryptoHandler()); |
+ if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler.get())) { |
return PDFPARSE_ERROR_HANDLER; |
} |
- m_Syntax.SetEncrypt(pCryptoHandler); |
+ m_Syntax.SetEncrypt(pCryptoHandler.release()); |
} else if (m_pEncryptDict) { |
CFX_ByteString filter = m_pEncryptDict->GetString(FX_BSTRC("Filter")); |
- CPDF_SecurityHandler* pSecurityHandler = NULL; |
+ nonstd::unique_ptr<CPDF_SecurityHandler> pSecurityHandler; |
FX_DWORD err = PDFPARSE_ERROR_HANDLER; |
if (filter == FX_BSTRC("Standard")) { |
- pSecurityHandler = FPDF_CreateStandardSecurityHandler(); |
+ pSecurityHandler.reset(FPDF_CreateStandardSecurityHandler()); |
err = PDFPARSE_ERROR_PASSWORD; |
} |
- if (pSecurityHandler == NULL) { |
+ if (!pSecurityHandler) { |
return PDFPARSE_ERROR_HANDLER; |
} |
if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) { |
- delete pSecurityHandler; |
- pSecurityHandler = NULL; |
return err; |
} |
- m_pSecurityHandler = pSecurityHandler; |
- CPDF_CryptoHandler* pCryptoHandler = |
- pSecurityHandler->CreateCryptoHandler(); |
- if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) { |
- delete pCryptoHandler; |
- pCryptoHandler = NULL; |
+ m_pSecurityHandler = nonstd::move(pSecurityHandler); |
+ nonstd::unique_ptr<CPDF_CryptoHandler> pCryptoHandler( |
+ m_pSecurityHandler->CreateCryptoHandler()); |
+ if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler.get())) { |
return PDFPARSE_ERROR_HANDLER; |
} |
- m_Syntax.SetEncrypt(pCryptoHandler); |
+ m_Syntax.SetEncrypt(pCryptoHandler.release()); |
} |
return PDFPARSE_ERROR_SUCCESS; |
} |
void CPDF_Parser::ReleaseEncryptHandler() { |
- delete m_Syntax.m_pCryptoHandler; |
- m_Syntax.m_pCryptoHandler = NULL; |
+ m_Syntax.m_pCryptoHandler.reset(); |
if (!m_bForceUseSecurityHandler) { |
- delete m_pSecurityHandler; |
- m_pSecurityHandler = NULL; |
+ m_pSecurityHandler.reset(); |
} |
} |
FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum) { |
@@ -447,24 +438,22 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
FX_DWORD start_objnum = 0; |
FX_DWORD count = dwObjCount; |
FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
- int32_t recordsize = 20; |
- char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); |
- pBuf[1024 * recordsize] = '\0'; |
+ const int32_t recordsize = 20; |
+ std::vector<char> buf(1024 * recordsize + 1); |
+ buf[1024 * recordsize] = '\0'; |
int32_t nBlocks = count / 1024 + 1; |
for (int32_t block = 0; block < nBlocks; block++) { |
int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; |
FX_DWORD dwReadSize = block_size * recordsize; |
if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_Syntax.m_FileLen) { |
- FX_Free(pBuf); |
return FALSE; |
} |
- if (!m_Syntax.ReadBlock((uint8_t*)pBuf, dwReadSize)) { |
- FX_Free(pBuf); |
+ if (!m_Syntax.ReadBlock((uint8_t*)buf.data(), dwReadSize)) { |
return FALSE; |
} |
for (int32_t i = 0; i < block_size; i++) { |
FX_DWORD objnum = start_objnum + block * 1024 + i; |
- char* pEntry = pBuf + i * recordsize; |
+ char* pEntry = buf.data() + i * recordsize; |
if (pEntry[17] == 'f') { |
m_CrossRef.SetAtGrow(objnum, 0); |
m_V5Type.SetAtGrow(objnum, 0); |
@@ -473,7 +462,6 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
if (offset == 0) { |
for (int32_t c = 0; c < 10; c++) { |
if (pEntry[c] < '0' || pEntry[c] > '9') { |
- FX_Free(pBuf); |
return FALSE; |
} |
} |
@@ -496,7 +484,6 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
} |
} |
} |
- FX_Free(pBuf); |
m_Syntax.RestorePos(SavedPos + count * recordsize); |
return TRUE; |
} |
@@ -539,21 +526,21 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
m_Syntax.ToNextWord(); |
SavedPos = m_Syntax.SavePos(); |
FX_BOOL bFirstItem = FALSE; |
- int32_t recordsize = 20; |
+ const int32_t recordsize = 20; |
if (bFirst) |
bFirstItem = TRUE; |
m_dwXrefStartObjNum = start_objnum; |
if (!bSkip) { |
- char* pBuf = FX_Alloc(char, 1024 * recordsize + 1); |
- pBuf[1024 * recordsize] = '\0'; |
+ std::vector<char> buf(1024 * recordsize + 1); |
+ buf[1024 * recordsize] = '\0'; |
int32_t nBlocks = count / 1024 + 1; |
FX_BOOL bFirstBlock = TRUE; |
for (int32_t block = 0; block < nBlocks; block++) { |
int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; |
- m_Syntax.ReadBlock((uint8_t*)pBuf, block_size * recordsize); |
+ m_Syntax.ReadBlock((uint8_t*)buf.data(), block_size * recordsize); |
for (int32_t i = 0; i < block_size; i++) { |
FX_DWORD objnum = start_objnum + block * 1024 + i; |
- char* pEntry = pBuf + i * recordsize; |
+ char* pEntry = buf.data() + i * recordsize; |
if (pEntry[17] == 'f') { |
if (bFirstItem) { |
objnum = 0; |
@@ -574,7 +561,6 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
if (offset == 0) { |
for (int32_t c = 0; c < 10; c++) { |
if (pEntry[c] < '0' || pEntry[c] > '9') { |
- FX_Free(pBuf); |
return false; |
} |
} |
@@ -596,7 +582,6 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
} |
} |
} |
- FX_Free(pBuf); |
} |
m_Syntax.RestorePos(SavedPos + count * recordsize); |
} |
@@ -1476,7 +1461,7 @@ CPDF_Dictionary* CPDF_Parser::LoadTrailerV4() { |
} |
FX_DWORD CPDF_Parser::GetPermissions(FX_BOOL bCheckRevision) { |
- if (m_pSecurityHandler == NULL) { |
+ if (!m_pSecurityHandler) { |
return (FX_DWORD)-1; |
} |
FX_DWORD dwPermission = m_pSecurityHandler->GetPermissions(); |
@@ -1495,17 +1480,12 @@ FX_BOOL CPDF_Parser::IsOwner() { |
} |
void CPDF_Parser::SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, |
FX_BOOL bForced) { |
- ASSERT(m_pSecurityHandler == NULL); |
- if (!m_bForceUseSecurityHandler) { |
- delete m_pSecurityHandler; |
- m_pSecurityHandler = NULL; |
- } |
m_bForceUseSecurityHandler = bForced; |
- m_pSecurityHandler = pSecurityHandler; |
+ m_pSecurityHandler.reset(pSecurityHandler); |
if (m_bForceUseSecurityHandler) { |
return; |
} |
- m_Syntax.m_pCryptoHandler = pSecurityHandler->CreateCryptoHandler(); |
+ m_Syntax.m_pCryptoHandler.reset(pSecurityHandler->CreateCryptoHandler()); |
m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler); |
} |
FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, |
@@ -1704,7 +1684,6 @@ int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; |
CPDF_SyntaxParser::CPDF_SyntaxParser() { |
m_pFileAccess = NULL; |
- m_pCryptoHandler = NULL; |
m_pFileBuf = NULL; |
m_BufSize = CPDF_ModuleMgr::kFileBufSize; |
m_pFileBuf = NULL; |
@@ -2409,7 +2388,7 @@ CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, |
const unsigned int ENDSTREAM_LEN = sizeof("endstream") - 1; |
const unsigned int ENDOBJ_LEN = sizeof("endobj") - 1; |
CPDF_CryptoHandler* pCryptoHandler = |
- objnum == (FX_DWORD)m_MetadataObjnum ? nullptr : m_pCryptoHandler; |
+ objnum == (FX_DWORD)m_MetadataObjnum ? nullptr : m_pCryptoHandler.get(); |
if (!pCryptoHandler) { |
FX_BOOL bSearchForKeyword = TRUE; |
if (len >= 0) { |