diff options
author | Jun Fang <jun_fang@foxitsoftware.com> | 2014-08-18 16:39:43 -0700 |
---|---|---|
committer | Jun Fang <jun_fang@foxitsoftware.com> | 2014-08-18 16:39:43 -0700 |
commit | 2d55db143eb59a4267160742669304bab2ae4985 (patch) | |
tree | ead3c7dd3b46e0f5788641729b076b3d849f819e /core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp | |
parent | 39a97eaf1132e9ae6311ef547133b53def0a2cc9 (diff) | |
download | pdfium-2d55db143eb59a4267160742669304bab2ae4985.tar.xz |
Font is used after release in CPDF_TextStateData::~CPDF_TextStateData
BUG=400996
R=tsepez@chromium.org
Review URL: https://codereview.chromium.org/477323002
Diffstat (limited to 'core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp')
-rw-r--r-- | core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp index 8053718c19..99bb5b89cd 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp @@ -285,6 +285,7 @@ void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, CPDF_TextStateData::CPDF_TextStateData() { m_pFont = NULL; + m_pDocument = NULL; m_FontSize = 1.0f; m_WordSpace = 0; m_CharSpace = 0; @@ -296,27 +297,35 @@ CPDF_TextStateData::CPDF_TextStateData() } CPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src) { + if (this == &src) { + return; + } FXSYS_memcpy32(this, &src, sizeof(CPDF_TextStateData)); - if (m_pFont && m_pFont->m_pDocument) { - m_pFont = m_pFont->m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE); + if (m_pDocument && m_pFont) { + m_pFont = m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE); } } CPDF_TextStateData::~CPDF_TextStateData() { - CPDF_Font* pFont = m_pFont; - if (pFont && pFont->m_pDocument) { - pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict()); + if (m_pDocument && m_pFont) { + CPDF_DocPageData *pPageData = m_pDocument->GetPageData(); + if (pPageData && !pPageData->IsForceClear()) { + pPageData->ReleaseFont(m_pFont->GetFontDict()); + } } } void CPDF_TextState::SetFont(CPDF_Font* pFont) { - CPDF_Font*& pStateFont = GetModify()->m_pFont; - CPDF_DocPageData* pDocPageData = NULL; - if (pStateFont && pStateFont->m_pDocument) { - pDocPageData = pStateFont->m_pDocument->GetPageData(); - pDocPageData->ReleaseFont(pStateFont->GetFontDict()); + CPDF_TextStateData* pStateData = GetModify(); + if (pStateData) { + CPDF_Document* pDoc = pStateData->m_pDocument; + CPDF_DocPageData *pPageData = pDoc ? pDoc->GetPageData() : NULL; + if (pPageData && pStateData->m_pFont && !pPageData->IsForceClear()) { + pPageData->ReleaseFont(pStateData->m_pFont->GetFontDict()); + } + pStateData->m_pDocument = pFont ? pFont->m_pDocument : NULL; + pStateData->m_pFont = pFont; } - pStateFont = pFont; } FX_FLOAT CPDF_TextState::GetFontSizeV() const { |