From dc359b03ab6a70ee52a91119ff6704cae92f4809 Mon Sep 17 00:00:00 2001 From: thestig Date: Tue, 9 Aug 2016 15:46:20 -0700 Subject: Fix a leak with FPDFPageObj_NewImgeObj(). BUG=pdfium:545 Review-Url: https://codereview.chromium.org/2194393002 --- core/fpdfapi/fpdf_page/cpdf_image.cpp | 95 +++++++++++++++-------------------- 1 file changed, 41 insertions(+), 54 deletions(-) (limited to 'core/fpdfapi/fpdf_page/cpdf_image.cpp') diff --git a/core/fpdfapi/fpdf_page/cpdf_image.cpp b/core/fpdfapi/fpdf_page/cpdf_image.cpp index 63e006fc06..af361eb9f6 100644 --- a/core/fpdfapi/fpdf_page/cpdf_image.cpp +++ b/core/fpdfapi/fpdf_page/cpdf_image.cpp @@ -6,6 +6,10 @@ #include "core/fpdfapi/fpdf_page/include/cpdf_image.h" +#include +#include +#include + #include "core/fpdfapi/fpdf_page/include/cpdf_page.h" #include "core/fpdfapi/fpdf_page/pageint.h" #include "core/fpdfapi/fpdf_parser/cpdf_boolean.h" @@ -19,14 +23,35 @@ #include "core/fxge/include/fx_dib.h" CPDF_Image::CPDF_Image(CPDF_Document* pDoc) + : CPDF_Image(pDoc, nullptr, false) {} + +CPDF_Image::CPDF_Image(CPDF_Document* pDoc, CPDF_Stream* pStream, bool bInline) : m_pDIBSource(nullptr), m_pMask(nullptr), m_MatteColor(0), - m_pStream(nullptr), - m_bInline(FALSE), + m_pStream(pStream), + m_bInline(bInline), m_pInlineDict(nullptr), + m_Height(0), + m_Width(0), + m_bIsMask(false), + m_bInterpolate(false), m_pDocument(pDoc), - m_pOC(nullptr) {} + m_pOC(nullptr) { + if (!pStream) + return; + + CPDF_Dictionary* pDict = pStream->GetDict(); + if (m_bInline) + m_pInlineDict = ToDictionary(pDict->Clone()); + + m_pOC = pDict->GetDictBy("OC"); + m_bIsMask = + !pDict->KeyExist("ColorSpace") || pDict->GetIntegerBy("ImageMask"); + m_bInterpolate = !!pDict->GetIntegerBy("Interpolate"); + m_Height = pDict->GetIntegerBy("Height"); + m_Width = pDict->GetIntegerBy("Width"); +} CPDF_Image::~CPDF_Image() { if (m_bInline) { @@ -37,43 +62,18 @@ CPDF_Image::~CPDF_Image() { } } -void CPDF_Image::Release() { - if (m_bInline || (m_pStream && m_pStream->GetObjNum() == 0)) - delete this; -} - CPDF_Image* CPDF_Image::Clone() { if (m_pStream->GetObjNum()) return m_pDocument->GetPageData()->GetImage(m_pStream); - CPDF_Image* pImage = new CPDF_Image(m_pDocument); - pImage->LoadImageF(ToStream(m_pStream->Clone()), m_bInline); + CPDF_Image* pImage = + new CPDF_Image(m_pDocument, ToStream(m_pStream->Clone()), m_bInline); if (m_bInline) pImage->SetInlineDict(ToDictionary(m_pInlineDict->Clone(TRUE))); return pImage; } -FX_BOOL CPDF_Image::LoadImageF(CPDF_Stream* pStream, FX_BOOL bInline) { - m_pStream = pStream; - if (m_bInline && m_pInlineDict) { - m_pInlineDict->Release(); - m_pInlineDict = nullptr; - } - m_bInline = bInline; - CPDF_Dictionary* pDict = pStream->GetDict(); - if (m_bInline) { - m_pInlineDict = ToDictionary(pDict->Clone()); - } - m_pOC = pDict->GetDictBy("OC"); - m_bIsMask = - !pDict->KeyExist("ColorSpace") || pDict->GetIntegerBy("ImageMask"); - m_bInterpolate = pDict->GetIntegerBy("Interpolate"); - m_Height = pDict->GetIntegerBy("Height"); - m_Width = pDict->GetIntegerBy("Width"); - return TRUE; -} - CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { int32_t width; int32_t height; @@ -120,36 +120,23 @@ CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, uint32_t size) { return pDict; } -void CPDF_Image::SetJpegImage(uint8_t* pData, uint32_t size) { - CPDF_Dictionary* pDict = InitJPEG(pData, size); - if (!pDict) { - return; - } - m_pStream->InitStream(pData, size, pDict); -} - void CPDF_Image::SetJpegImage(IFX_FileRead* pFile) { uint32_t size = (uint32_t)pFile->GetSize(); - if (!size) { + if (!size) return; - } - uint32_t dwEstimateSize = size; - if (dwEstimateSize > 8192) { - dwEstimateSize = 8192; - } - uint8_t* pData = FX_Alloc(uint8_t, dwEstimateSize); - pFile->ReadBlock(pData, 0, dwEstimateSize); - CPDF_Dictionary* pDict = InitJPEG(pData, dwEstimateSize); - FX_Free(pData); + + uint32_t dwEstimateSize = std::min(size, 8192U); + std::vector data(dwEstimateSize); + pFile->ReadBlock(data.data(), 0, dwEstimateSize); + CPDF_Dictionary* pDict = InitJPEG(data.data(), dwEstimateSize); if (!pDict && size > dwEstimateSize) { - pData = FX_Alloc(uint8_t, size); - pFile->ReadBlock(pData, 0, size); - pDict = InitJPEG(pData, size); - FX_Free(pData); + data.resize(size); + pFile->ReadBlock(data.data(), 0, size); + pDict = InitJPEG(data.data(), size); } - if (!pDict) { + if (!pDict) return; - } + m_pStream->InitStreamFromFile(pFile, pDict); } -- cgit v1.2.3