diff options
Diffstat (limited to 'core/fpdfapi/page')
-rw-r--r-- | core/fpdfapi/page/cpdf_docpagedata.cpp | 5 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_image.cpp | 19 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_image.h | 2 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_streamcontentparser.cpp | 51 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_streamcontentparser.h | 32 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_streamparser.cpp | 80 | ||||
-rw-r--r-- | core/fpdfapi/page/pageint.h | 14 |
7 files changed, 101 insertions, 102 deletions
diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp index 3df771070e..1c99d523b0 100644 --- a/core/fpdfapi/page/cpdf_docpagedata.cpp +++ b/core/fpdfapi/page/cpdf_docpagedata.cpp @@ -182,9 +182,8 @@ CPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteString& fontName, pDict->SetNewFor<CPDF_Name>("Subtype", "Type1"); pDict->SetNewFor<CPDF_Name>("BaseFont", fontName); if (pEncoding) { - pDict->SetFor( - "Encoding", - pdfium::WrapUnique(pEncoding->Realize(m_pPDFDoc->GetByteStringPool()))); + pDict->SetFor("Encoding", + pEncoding->Realize(m_pPDFDoc->GetByteStringPool())); } std::unique_ptr<CPDF_Font> pFont = CPDF_Font::Create(m_pPDFDoc, pDict); diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp index 66599a8268..dafca2b764 100644 --- a/core/fpdfapi/page/cpdf_image.cpp +++ b/core/fpdfapi/page/cpdf_image.cpp @@ -26,6 +26,7 @@ #include "core/fpdfapi/render/render_int.h" #include "core/fxcodec/fx_codec.h" #include "core/fxge/fx_dib.h" +#include "third_party/base/numerics/safe_conversions.h" #include "third_party/base/ptr_util.h" CPDF_Image::CPDF_Image(CPDF_Document* pDoc) : m_pDocument(pDoc) {} @@ -86,7 +87,8 @@ void CPDF_Image::ConvertStreamToIndirectObject() { m_pDocument->AddIndirectObject(std::move(m_pOwnedStream)); } -CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { +std::unique_ptr<CPDF_Dictionary> CPDF_Image::InitJPEG(uint8_t* pData, + uint32_t size) { int32_t width; int32_t height; int32_t num_comps; @@ -97,8 +99,8 @@ CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { return nullptr; } - CPDF_Dictionary* pDict = - new CPDF_Dictionary(m_pDocument->GetByteStringPool()); + auto pDict = + pdfium::MakeUnique<CPDF_Dictionary>(m_pDocument->GetByteStringPool()); pDict->SetNewFor<CPDF_Name>("Type", "XObject"); pDict->SetNewFor<CPDF_Name>("Subtype", "Image"); pDict->SetNewFor<CPDF_Number>("Width", width); @@ -134,14 +136,17 @@ CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { } void CPDF_Image::SetJpegImage(IFX_SeekableReadStream* pFile) { - uint32_t size = (uint32_t)pFile->GetSize(); + uint32_t size = pdfium::base::checked_cast<uint32_t>(pFile->GetSize()); if (!size) return; uint32_t dwEstimateSize = std::min(size, 8192U); std::vector<uint8_t> data(dwEstimateSize); - pFile->ReadBlock(data.data(), 0, dwEstimateSize); - CPDF_Dictionary* pDict = InitJPEG(data.data(), dwEstimateSize); + if (!pFile->ReadBlock(data.data(), 0, dwEstimateSize)) + return; + + std::unique_ptr<CPDF_Dictionary> pDict = + InitJPEG(data.data(), dwEstimateSize); if (!pDict && size > dwEstimateSize) { data.resize(size); pFile->ReadBlock(data.data(), 0, size); @@ -150,7 +155,7 @@ void CPDF_Image::SetJpegImage(IFX_SeekableReadStream* pFile) { if (!pDict) return; - m_pStream->InitStreamFromFile(pFile, pdfium::WrapUnique(pDict)); + m_pStream->InitStreamFromFile(pFile, std::move(pDict)); } void CPDF_Image::SetImage(const CFX_DIBitmap* pBitmap) { diff --git a/core/fpdfapi/page/cpdf_image.h b/core/fpdfapi/page/cpdf_image.h index ac35ce1ac7..1491efe1c6 100644 --- a/core/fpdfapi/page/cpdf_image.h +++ b/core/fpdfapi/page/cpdf_image.h @@ -70,7 +70,7 @@ class CPDF_Image { private: void FinishInitialization(); - CPDF_Dictionary* InitJPEG(uint8_t* pData, uint32_t size); + std::unique_ptr<CPDF_Dictionary> InitJPEG(uint8_t* pData, uint32_t size); int32_t m_Height = 0; int32_t m_Width = 0; diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index 107ab1ccaa..8c6038d626 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp @@ -306,8 +306,8 @@ int CPDF_StreamContentParser::GetNextParamPos() { if (m_ParamStartPos == kParamBufSize) { m_ParamStartPos = 0; } - if (m_ParamBuf[m_ParamStartPos].m_Type == 0) - delete m_ParamBuf[m_ParamStartPos].m_pObject; + if (m_ParamBuf[m_ParamStartPos].m_Type == ContentParam::OBJECT) + m_ParamBuf[m_ParamStartPos].m_pObject.reset(); return m_ParamStartPos; } @@ -324,8 +324,8 @@ void CPDF_StreamContentParser::AddNameParam(const FX_CHAR* name, int len) { ContentParam& param = m_ParamBuf[GetNextParamPos()]; if (len > 32) { param.m_Type = ContentParam::OBJECT; - param.m_pObject = - new CPDF_Name(m_pDocument->GetByteStringPool(), PDF_NameDecode(bsName)); + param.m_pObject = pdfium::MakeUnique<CPDF_Name>( + m_pDocument->GetByteStringPool(), PDF_NameDecode(bsName)); } else { param.m_Type = ContentParam::NAME; if (bsName.Find('#') == -1) { @@ -346,22 +346,21 @@ void CPDF_StreamContentParser::AddNumberParam(const FX_CHAR* str, int len) { FX_atonum(CFX_ByteStringC(str, len), ¶m.m_Number.m_Integer); } -void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj) { +void CPDF_StreamContentParser::AddObjectParam( + std::unique_ptr<CPDF_Object> pObj) { ContentParam& param = m_ParamBuf[GetNextParamPos()]; param.m_Type = ContentParam::OBJECT; - param.m_pObject = pObj; + param.m_pObject = std::move(pObj); } void CPDF_StreamContentParser::ClearAllParams() { uint32_t index = m_ParamStartPos; for (uint32_t i = 0; i < m_ParamCount; i++) { - if (m_ParamBuf[index].m_Type == 0) - delete m_ParamBuf[index].m_pObject; - + if (m_ParamBuf[index].m_Type == ContentParam::OBJECT) + m_ParamBuf[index].m_pObject.reset(); index++; - if (index == kParamBufSize) { + if (index == kParamBufSize) index = 0; - } } m_ParamStartPos = 0; m_ParamCount = 0; @@ -377,25 +376,23 @@ CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { } ContentParam& param = m_ParamBuf[real_index]; if (param.m_Type == ContentParam::NUMBER) { - CPDF_Number* pNumber = param.m_Number.m_bInteger - ? new CPDF_Number(param.m_Number.m_Integer) - : new CPDF_Number(param.m_Number.m_Float); - param.m_Type = ContentParam::OBJECT; - param.m_pObject = pNumber; - return pNumber; + param.m_pObject = + param.m_Number.m_bInteger + ? pdfium::MakeUnique<CPDF_Number>(param.m_Number.m_Integer) + : pdfium::MakeUnique<CPDF_Number>(param.m_Number.m_Float); + return param.m_pObject.get(); } if (param.m_Type == ContentParam::NAME) { - CPDF_Name* pName = new CPDF_Name( + param.m_Type = ContentParam::OBJECT; + param.m_pObject = pdfium::MakeUnique<CPDF_Name>( m_pDocument->GetByteStringPool(), CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len)); - param.m_Type = ContentParam::OBJECT; - param.m_pObject = pName; - return pName; - } - if (param.m_Type == ContentParam::OBJECT) { - return param.m_pObject; + return param.m_pObject.get(); } + if (param.m_Type == ContentParam::OBJECT) + return param.m_pObject.get(); + ASSERT(false); return nullptr; } @@ -651,7 +648,7 @@ void CPDF_StreamContentParser::Handle_BeginImage() { } CFX_ByteString key((const FX_CHAR*)m_pSyntax->GetWordBuf() + 1, m_pSyntax->GetWordSize() - 1); - auto pObj = pdfium::WrapUnique(m_pSyntax->ReadNextObject(false, 0)); + auto pObj = m_pSyntax->ReadNextObject(false, 0); if (!key.IsEmpty()) { uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0; if (dwObjNum) @@ -1668,3 +1665,7 @@ void CPDF_StreamContentParser::ParsePathObject() { } } } + +CPDF_StreamContentParser::ContentParam::ContentParam() {} + +CPDF_StreamContentParser::ContentParam::~ContentParam() {} diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.h b/core/fpdfapi/page/cpdf_streamcontentparser.h index 1ed2aaa4de..dfb5230809 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.h +++ b/core/fpdfapi/page/cpdf_streamcontentparser.h @@ -52,21 +52,23 @@ class CPDF_StreamContentParser { private: struct ContentParam { enum Type { OBJECT = 0, NUMBER, NAME }; + + ContentParam(); + ~ContentParam(); + Type m_Type; - union { - struct { - bool m_bInteger; - union { - int m_Integer; - FX_FLOAT m_Float; - }; - } m_Number; - CPDF_Object* m_pObject; - struct { - int m_Len; - char m_Buffer[32]; - } m_Name; - }; + std::unique_ptr<CPDF_Object> m_pObject; + struct { + bool m_bInteger; + union { + int m_Integer; + FX_FLOAT m_Float; + }; + } m_Number; + struct { + int m_Len; + char m_Buffer[32]; + } m_Name; }; static const int kParamBufSize = 16; @@ -76,7 +78,7 @@ class CPDF_StreamContentParser { static OpCodes InitializeOpCodes(); void AddNumberParam(const FX_CHAR* str, int len); - void AddObjectParam(CPDF_Object* pObj); + void AddObjectParam(std::unique_ptr<CPDF_Object> pObj); void AddNameParam(const FX_CHAR* name, int size); int GetNextParamPos(); void ClearAllParams(); diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp index f271e58d78..2901d3b50b 100644 --- a/core/fpdfapi/page/cpdf_streamparser.cpp +++ b/core/fpdfapi/page/cpdf_streamparser.cpp @@ -8,6 +8,7 @@ #include <limits.h> +#include <memory> #include <utility> #include "core/fpdfapi/cpdf_modulemgr.h" @@ -112,7 +113,6 @@ CPDF_StreamParser::CPDF_StreamParser(const uint8_t* pData, uint32_t dwSize) : m_pBuf(pData), m_Size(dwSize), m_Pos(0), - m_pLastObj(nullptr), m_pPool(nullptr) {} CPDF_StreamParser::CPDF_StreamParser( @@ -122,16 +122,14 @@ CPDF_StreamParser::CPDF_StreamParser( : m_pBuf(pData), m_Size(dwSize), m_Pos(0), - m_pLastObj(nullptr), m_pPool(pPool) {} -CPDF_StreamParser::~CPDF_StreamParser() { - delete m_pLastObj; -} +CPDF_StreamParser::~CPDF_StreamParser() {} -CPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc, - CPDF_Dictionary* pDict, - CPDF_Object* pCSObj) { +std::unique_ptr<CPDF_Stream> CPDF_StreamParser::ReadInlineStream( + CPDF_Document* pDoc, + CPDF_Dictionary* pDict, + CPDF_Object* pCSObj) { if (m_Pos == m_Size) return nullptr; @@ -233,15 +231,13 @@ CPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc, m_Pos += dwStreamSize; } pDict->SetNewFor<CPDF_Number>("Length", (int)dwStreamSize); - return new CPDF_Stream(pData, dwStreamSize, pdfium::WrapUnique(pDict)); + return pdfium::MakeUnique<CPDF_Stream>(pData, dwStreamSize, + pdfium::WrapUnique(pDict)); } CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement() { - delete m_pLastObj; - m_pLastObj = nullptr; - + m_pLastObj.reset(); m_WordSize = 0; - bool bIsNumber = true; if (!PositionIsInBounds()) return EndOfData; @@ -273,6 +269,7 @@ CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement() { return Others; } + bool bIsNumber = true; while (1) { if (m_WordSize < kMaxWordBuffer) m_WordBuffer[m_WordSize++] = ch; @@ -300,30 +297,25 @@ CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement() { if (m_WordSize == 4) { if (memcmp(m_WordBuffer, "true", 4) == 0) { - m_pLastObj = new CPDF_Boolean(true); + m_pLastObj = pdfium::MakeUnique<CPDF_Boolean>(true); return Others; } if (memcmp(m_WordBuffer, "null", 4) == 0) { - m_pLastObj = new CPDF_Null; + m_pLastObj = pdfium::MakeUnique<CPDF_Null>(); return Others; } } else if (m_WordSize == 5) { if (memcmp(m_WordBuffer, "false", 5) == 0) { - m_pLastObj = new CPDF_Boolean(false); + m_pLastObj = pdfium::MakeUnique<CPDF_Boolean>(false); return Others; } } return Keyword; } -CPDF_Object* CPDF_StreamParser::GetObject() { - CPDF_Object* pObj = m_pLastObj; - m_pLastObj = nullptr; - return pObj; -} - -CPDF_Object* CPDF_StreamParser::ReadNextObject(bool bAllowNestedArray, - uint32_t dwInArrayLevel) { +std::unique_ptr<CPDF_Object> CPDF_StreamParser::ReadNextObject( + bool bAllowNestedArray, + uint32_t dwInArrayLevel) { bool bIsNumber; GetNextWord(bIsNumber); if (!m_WordSize) @@ -331,47 +323,45 @@ CPDF_Object* CPDF_StreamParser::ReadNextObject(bool bAllowNestedArray, if (bIsNumber) { m_WordBuffer[m_WordSize] = 0; - return new CPDF_Number(CFX_ByteStringC(m_WordBuffer, m_WordSize)); + return pdfium::MakeUnique<CPDF_Number>( + CFX_ByteStringC(m_WordBuffer, m_WordSize)); } int first_char = m_WordBuffer[0]; if (first_char == '/') { CFX_ByteString name = PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)); - return new CPDF_Name(m_pPool, name); + return pdfium::MakeUnique<CPDF_Name>(m_pPool, name); } if (first_char == '(') { CFX_ByteString str = ReadString(); - return new CPDF_String(m_pPool, str, false); + return pdfium::MakeUnique<CPDF_String>(m_pPool, str, false); } if (first_char == '<') { if (m_WordSize == 1) - return new CPDF_String(m_pPool, ReadHexString(), true); + return pdfium::MakeUnique<CPDF_String>(m_pPool, ReadHexString(), true); - CPDF_Dictionary* pDict = new CPDF_Dictionary(m_pPool); + auto pDict = pdfium::MakeUnique<CPDF_Dictionary>(m_pPool); while (1) { GetNextWord(bIsNumber); if (m_WordSize == 2 && m_WordBuffer[0] == '>') break; - if (!m_WordSize || m_WordBuffer[0] != '/') { - delete pDict; + if (!m_WordSize || m_WordBuffer[0] != '/') return nullptr; - } CFX_ByteString key = PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)); - auto pObj = pdfium::WrapUnique(ReadNextObject(true, 0)); - if (!pObj) { - delete pDict; + std::unique_ptr<CPDF_Object> pObj = ReadNextObject(true, 0); + if (!pObj) return nullptr; - } + if (!key.IsEmpty()) pDict->SetFor(key, std::move(pObj)); } - return pDict; + return std::move(pDict); } if (first_char == '[') { @@ -380,28 +370,28 @@ CPDF_Object* CPDF_StreamParser::ReadNextObject(bool bAllowNestedArray, return nullptr; } - CPDF_Array* pArray = new CPDF_Array; + auto pArray = pdfium::MakeUnique<CPDF_Array>(); while (1) { - CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, dwInArrayLevel + 1); + std::unique_ptr<CPDF_Object> pObj = + ReadNextObject(bAllowNestedArray, dwInArrayLevel + 1); if (pObj) { - pArray->Add(pdfium::WrapUnique(pObj)); + pArray->Add(std::move(pObj)); continue; } if (!m_WordSize || m_WordBuffer[0] == ']') break; } - return pArray; + return std::move(pArray); } if (m_WordSize == 5 && !memcmp(m_WordBuffer, "false", 5)) - return new CPDF_Boolean(false); + return pdfium::MakeUnique<CPDF_Boolean>(false); if (m_WordSize == 4) { if (memcmp(m_WordBuffer, "true", 4) == 0) - return new CPDF_Boolean(true); - + return pdfium::MakeUnique<CPDF_Boolean>(true); if (memcmp(m_WordBuffer, "null", 4) == 0) - return new CPDF_Null; + return pdfium::MakeUnique<CPDF_Null>(); } return nullptr; diff --git a/core/fpdfapi/page/pageint.h b/core/fpdfapi/page/pageint.h index dee9639d7d..cf3522d44a 100644 --- a/core/fpdfapi/page/pageint.h +++ b/core/fpdfapi/page/pageint.h @@ -11,6 +11,7 @@ #include <memory> #include <set> #include <unordered_map> +#include <utility> #include <vector> #include "core/fpdfapi/page/cpdf_contentmark.h" @@ -52,16 +53,17 @@ class CPDF_StreamParser { const CFX_WeakPtr<CFX_ByteStringPool>& pPool); ~CPDF_StreamParser(); - CPDF_Stream* ReadInlineStream(CPDF_Document* pDoc, - CPDF_Dictionary* pDict, - CPDF_Object* pCSObj); SyntaxType ParseNextElement(); uint8_t* GetWordBuf() { return m_WordBuffer; } uint32_t GetWordSize() const { return m_WordSize; } - CPDF_Object* GetObject(); uint32_t GetPos() const { return m_Pos; } void SetPos(uint32_t pos) { m_Pos = pos; } - CPDF_Object* ReadNextObject(bool bAllowNestedArray, uint32_t dwInArrayLevel); + std::unique_ptr<CPDF_Object> GetObject() { return std::move(m_pLastObj); } + std::unique_ptr<CPDF_Object> ReadNextObject(bool bAllowNestedArray, + uint32_t dwInArrayLevel); + std::unique_ptr<CPDF_Stream> ReadInlineStream(CPDF_Document* pDoc, + CPDF_Dictionary* pDict, + CPDF_Object* pCSObj); private: friend class cpdf_streamparser_ReadHexString_Test; @@ -76,7 +78,7 @@ class CPDF_StreamParser { uint32_t m_Pos; // Current byte position within m_pBuf. uint8_t m_WordBuffer[256]; uint32_t m_WordSize; - CPDF_Object* m_pLastObj; + std::unique_ptr<CPDF_Object> m_pLastObj; CFX_WeakPtr<CFX_ByteStringPool> m_pPool; }; |