Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Unified Diff: xfa/src/fgas/src/font/fx_gefont.cpp

Issue 1465423002: Fix a crasher in LoadFont() when non-standard font is used in XFA files (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « xfa/src/fgas/src/font/fx_gefont.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: xfa/src/fgas/src/font/fx_gefont.cpp
diff --git a/xfa/src/fgas/src/font/fx_gefont.cpp b/xfa/src/fgas/src/font/fx_gefont.cpp
index 280e0fb8cd6820406a839ae2f512a60715bdbf7e..e3f04796dec6d8f1e68360088d67e94ee530ce2e 100644
--- a/xfa/src/fgas/src/font/fx_gefont.cpp
+++ b/xfa/src/fgas/src/font/fx_gefont.cpp
@@ -189,7 +189,7 @@ IFX_Font* CFX_GEFont::Retain() {
FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFontFamily,
FX_DWORD dwFontStyles,
FX_WORD wCodePage) {
- if (m_pFont != NULL) {
+ if (m_pFont) {
return FALSE;
}
Lock();
@@ -237,33 +237,27 @@ FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFontFamily,
m_pFont->LoadSubst(csFontFamily, TRUE, dwFlags, iWeight, 0, wCodePage);
FX_BOOL bRet = m_pFont->GetFace() != nullptr;
if (bRet) {
- InitFont();
+ bRet = InitFont();
}
Unlock();
return bRet;
}
FX_BOOL CFX_GEFont::LoadFont(const uint8_t* pBuffer, int32_t length) {
- if (m_pFont != NULL) {
+ if (m_pFont) {
return FALSE;
}
Lock();
m_pFont = new CFX_Font;
FX_BOOL bRet = m_pFont->LoadEmbedded(pBuffer, length);
if (bRet) {
- InitFont();
+ bRet = InitFont();
}
m_wCharSet = 0xFFFF;
Unlock();
return bRet;
}
FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFileName) {
- if (m_pFont != NULL) {
- return FALSE;
- }
- if (m_pStream != NULL) {
- return FALSE;
- }
- if (m_pFileRead != NULL) {
+ if (m_pFont || m_pStream || m_pFileRead) {
return FALSE;
}
Lock();
@@ -271,14 +265,14 @@ FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFileName) {
pszFileName, FX_STREAMACCESS_Binary | FX_STREAMACCESS_Read);
m_pFileRead = FX_CreateFileRead(m_pStream);
FX_BOOL bRet = FALSE;
- if (m_pStream != NULL && m_pFileRead != NULL) {
+ if (m_pStream && m_pFileRead) {
m_pFont = new CFX_Font;
bRet = m_pFont->LoadFile(m_pFileRead);
- if (!bRet) {
- m_pFileRead->Release();
- m_pFileRead = NULL;
+ if (bRet) {
+ bRet = InitFont();
} else {
- InitFont();
+ m_pFileRead->Release();
+ m_pFileRead = nullptr;
}
}
m_wCharSet = 0xFFFF;
@@ -286,13 +280,7 @@ FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFileName) {
return bRet;
}
FX_BOOL CFX_GEFont::LoadFont(IFX_Stream* pFontStream, FX_BOOL bSaveStream) {
- if (m_pFont != NULL) {
- return FALSE;
- }
- if (pFontStream == NULL || pFontStream->GetLength() < 1) {
- return FALSE;
- }
- if (m_pFileRead != NULL) {
+ if (m_pFont || m_pFileRead || !pFontStream || pFontStream->GetLength() < 1) {
return FALSE;
}
Lock();
@@ -302,50 +290,53 @@ FX_BOOL CFX_GEFont::LoadFont(IFX_Stream* pFontStream, FX_BOOL bSaveStream) {
m_pFileRead = FX_CreateFileRead(pFontStream);
m_pFont = new CFX_Font;
FX_BOOL bRet = m_pFont->LoadFile(m_pFileRead);
- if (!bRet) {
- m_pFileRead->Release();
- m_pFileRead = NULL;
+ if (bRet) {
+ bRet = InitFont();
} else {
- InitFont();
+ m_pFileRead->Release();
+ m_pFileRead = nullptr;
}
m_wCharSet = 0xFFFF;
Unlock();
return bRet;
}
FX_BOOL CFX_GEFont::LoadFont(CFX_Font* pExtFont, FX_BOOL bTakeOver) {
- if (m_pFont != NULL) {
- return FALSE;
- }
- if (pExtFont == NULL) {
+ if (m_pFont || !pExtFont) {
return FALSE;
}
Lock();
- if ((m_pFont = pExtFont) != NULL) {
+ m_pFont = pExtFont;
+ FX_BOOL bRet = !!m_pFont;
+ if (bRet) {
m_bExtFont = !bTakeOver;
- InitFont();
+ bRet = InitFont();
} else {
m_bExtFont = TRUE;
}
m_wCharSet = 0xFFFF;
Unlock();
- return m_pFont != NULL;
+ return bRet;
}
-void CFX_GEFont::InitFont() {
- if (m_pFont == NULL) {
- return;
+FX_BOOL CFX_GEFont::InitFont() {
+ if (!m_pFont) {
+ return FALSE;
}
- if (m_pFontEncoding == NULL) {
+ if (!m_pFontEncoding) {
m_pFontEncoding = FX_CreateFontEncodingEx(m_pFont);
+ if (!m_pFontEncoding) {
+ return FALSE;
+ }
}
- if (m_pCharWidthMap == NULL) {
+ if (!m_pCharWidthMap) {
m_pCharWidthMap = new CFX_WordDiscreteArray(1024);
}
- if (m_pRectArray == NULL) {
+ if (!m_pRectArray) {
m_pRectArray = new CFX_RectMassArray(16);
}
- if (m_pBBoxMap == NULL) {
+ if (!m_pBBoxMap) {
m_pBBoxMap = new CFX_MapPtrToPtr(16);
}
+ return TRUE;
}
IFX_Font* CFX_GEFont::Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage) {
if (GetFontStyles() == dwFontStyles) {
« no previous file with comments | « xfa/src/fgas/src/font/fx_gefont.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698