Speculative follow-up for bug_974091.
A failed return from GetFixedFace() might result in the eventual
freeing of a pre-existing CTTFontDesc, so check before adding a new one.
Additionally, split the Get/Add calls so that Get isn't duplicating
work performed by Add.
Bug: chromium:974091
Change-Id: I874f7a85f5c162cd6c4832141a7dac4f6cc8d2b8
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/56331
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/cfx_fontmgr.cpp b/core/fxge/cfx_fontmgr.cpp
index f5ae895..d4d3cde 100644
--- a/core/fxge/cfx_fontmgr.cpp
+++ b/core/fxge/cfx_fontmgr.cpp
@@ -156,14 +156,7 @@
CTTFontDesc* pFontDesc = it->second.get();
*pFontData = pFontDesc->FontData();
int face_index = GetTTCIndex(pFontDesc->FontData(), ttc_size, font_offset);
- RetainPtr<CFX_Face> pFace(pFontDesc->GetFace(face_index));
- if (pFace)
- return pFace;
-
- pFace = GetFixedFace({pFontDesc->FontData(), static_cast<size_t>(ttc_size)},
- face_index);
- pFontDesc->SetFace(face_index, pFace.Get());
- return pFace;
+ return pdfium::WrapRetain(pFontDesc->GetFace(face_index));
}
RetainPtr<CFX_Face> CFX_FontMgr::AddCachedTTCFace(
@@ -175,9 +168,21 @@
int face_index = GetTTCIndex(pData.get(), ttc_size, font_offset);
RetainPtr<CFX_Face> face =
GetFixedFace({pData.get(), static_cast<size_t>(ttc_size)}, face_index);
- auto pFontDesc = pdfium::MakeUnique<CTTFontDesc>(std::move(pData));
+ if (!face)
+ return nullptr;
+
+ CTTFontDesc* pFontDesc = nullptr;
+ ByteString keyname = KeyNameFromSize(ttc_size, checksum);
+ auto it = m_FaceMap.find(keyname);
+ if (it != m_FaceMap.end())
+ pFontDesc = it->second.get();
+
+ if (!pFontDesc) {
+ auto pNewDesc = pdfium::MakeUnique<CTTFontDesc>(std::move(pData));
+ pFontDesc = pNewDesc.get();
+ m_FaceMap[keyname] = std::move(pNewDesc);
+ }
pFontDesc->SetFace(face_index, face.Get());
- m_FaceMap[KeyNameFromSize(ttc_size, checksum)] = std::move(pFontDesc);
return face;
}