diff options
author | weili <weili@chromium.org> | 2016-09-08 11:47:29 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-09-08 11:47:29 -0700 |
commit | c29fc707b24b9528e41a242cfa298275708ffc76 (patch) | |
tree | 392dcb77aef5657b51a25a632435fcc9787bcc89 /xfa/fgas/font/fgas_gefont.cpp | |
parent | a31da74cffa8c3ff919051cc49bc006aeb55d345 (diff) | |
download | pdfium-c29fc707b24b9528e41a242cfa298275708ffc76.tar.xz |
Fix memory management errors for font loading and copying
A few issues are fixed:
--Change variable |m_bLogic| in CFX_Font to |m_bShallowCopy| to
reflect its meaning better;
--For a shallow copy of font, we must guarantee that the copied font
will not be deleted until the shallow copy is deleted. So need to
increase the src font's refcount when copying it;
--The stream |m_pOwnedStream| needs to have matched new/delete
These errors need to be fixed before we can properly delete all the
fonts to address the leaks.
BUG=pdfium:242
Review-Url: https://codereview.chromium.org/2322043002
Diffstat (limited to 'xfa/fgas/font/fgas_gefont.cpp')
-rw-r--r-- | xfa/fgas/font/fgas_gefont.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/xfa/fgas/font/fgas_gefont.cpp b/xfa/fgas/font/fgas_gefont.cpp index 1507fa4840..d3be9dcb48 100644 --- a/xfa/fgas/font/fgas_gefont.cpp +++ b/xfa/fgas/font/fgas_gefont.cpp @@ -77,26 +77,29 @@ CFGAS_GEFont::CFGAS_GEFont(IFGAS_FontMgr* pFontMgr) m_dwLogFontStyle(0), #endif m_pFont(nullptr), + m_pSrcFont(nullptr), m_pFontMgr(pFontMgr), m_iRefCount(1), m_bExtFont(FALSE), m_pProvider(nullptr) { } -CFGAS_GEFont::CFGAS_GEFont(const CFGAS_GEFont& src, uint32_t dwFontStyles) +CFGAS_GEFont::CFGAS_GEFont(CFGAS_GEFont* src, uint32_t dwFontStyles) : #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ m_bUseLogFontStyle(FALSE), m_dwLogFontStyle(0), #endif m_pFont(nullptr), - m_pFontMgr(src.m_pFontMgr), + m_pSrcFont(src), + m_pFontMgr(src->m_pFontMgr), m_iRefCount(1), m_bExtFont(FALSE), m_pProvider(nullptr) { - ASSERT(src.m_pFont); + ASSERT(m_pSrcFont->m_pFont); + m_pSrcFont->Retain(); m_pFont = new CFX_Font; - m_pFont->LoadClone(src.m_pFont); + m_pFont->LoadClone(m_pSrcFont->m_pFont); CFX_SubstFont* pSubst = m_pFont->GetSubstFont(); if (!pSubst) { pSubst = new CFX_SubstFont; @@ -119,6 +122,11 @@ CFGAS_GEFont::~CFGAS_GEFont() { if (!m_bExtFont) delete m_pFont; + + // If it is a shallow copy of another source font, + // decrease the refcount of the source font. + if (m_pSrcFont) + m_pSrcFont->Release(); } void CFGAS_GEFont::Release() { @@ -239,7 +247,7 @@ FX_BOOL CFGAS_GEFont::InitFont() { CFGAS_GEFont* CFGAS_GEFont::Derive(uint32_t dwFontStyles, uint16_t wCodePage) { if (GetFontStyles() == dwFontStyles) return Retain(); - return new CFGAS_GEFont(*this, dwFontStyles); + return new CFGAS_GEFont(this, dwFontStyles); } void CFGAS_GEFont::GetFamilyName(CFX_WideString& wsFamily) const { |