Store size information in CTTFontDesc.

This will allow it to return (checked) spans (storing a buffer
without an explicit length is a red flag anyways).

- use (checked) first() method to prove ttc_size in bounds.
- Pass span to other functions, but don't yet do new bounds checks.
- Rename GetFixedFace() to NewFixedFace() as it always returns a new one.

Change-Id: I675856bf09a7c3b3e0d6905f59f68d0153bb0aeb
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/56533
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/cfx_font.cpp b/core/fxge/cfx_font.cpp
index 35a829a..e656c82 100644
--- a/core/fxge/cfx_font.cpp
+++ b/core/fxge/cfx_font.cpp
@@ -378,7 +378,7 @@
   m_pFontDataAllocation =
       std::vector<uint8_t>(src_span.begin(), src_span.end());
   m_Face =
-      CFX_GEModule::Get()->GetFontMgr()->GetFixedFace(m_pFontDataAllocation, 0);
+      CFX_GEModule::Get()->GetFontMgr()->NewFixedFace(m_pFontDataAllocation, 0);
   m_bEmbedded = true;
   m_FontData = m_pFontDataAllocation;
   return !!m_Face;
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp
index fd736ba..03425ea 100644
--- a/core/fxge/cfx_fontmapper.cpp
+++ b/core/fxge/cfx_fontmapper.cpp
@@ -349,7 +349,7 @@
     Optional<pdfium::span<const uint8_t>> font_data =
         m_pFontMgr->GetBuiltinFont(iBaseFont);
     if (font_data.has_value()) {
-      m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(font_data.value(), 0);
+      m_FoxitFaces[iBaseFont] = m_pFontMgr->NewFixedFace(font_data.value(), 0);
       return m_FoxitFaces[iBaseFont];
     }
   }
@@ -362,14 +362,14 @@
     pSubstFont->m_Family = "Chrome Serif";
     if (!m_MMFaces[1]) {
       m_MMFaces[1] =
-          m_pFontMgr->GetFixedFace(m_pFontMgr->GetBuiltinFont(14).value(), 0);
+          m_pFontMgr->NewFixedFace(m_pFontMgr->GetBuiltinFont(14).value(), 0);
     }
     return m_MMFaces[1];
   }
   pSubstFont->m_Family = "Chrome Sans";
   if (!m_MMFaces[0]) {
     m_MMFaces[0] =
-        m_pFontMgr->GetFixedFace(m_pFontMgr->GetBuiltinFont(15).value(), 0);
+        m_pFontMgr->NewFixedFace(m_pFontMgr->GetBuiltinFont(15).value(), 0);
   }
   return m_MMFaces[0];
 }
@@ -701,7 +701,7 @@
                                                   int weight,
                                                   bool bItalic,
                                                   uint32_t font_size) {
-  uint8_t* pIgnore = nullptr;
+  const uint8_t* pIgnore = nullptr;
   RetainPtr<CFX_Face> face =
       m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, &pIgnore);
   if (face)
diff --git a/core/fxge/cfx_fontmgr.cpp b/core/fxge/cfx_fontmgr.cpp
index 828f0dc..c261d8f 100644
--- a/core/fxge/cfx_fontmgr.cpp
+++ b/core/fxge/cfx_fontmgr.cpp
@@ -60,14 +60,12 @@
   return ByteString::Format("%d:%d", ttc_size, checksum);
 }
 
-int GetTTCIndex(const uint8_t* pFontData,
-                uint32_t ttc_size,
-                uint32_t font_offset) {
-  const uint8_t* p = pFontData + 8;
+int GetTTCIndex(pdfium::span<const uint8_t> pFontData, uint32_t font_offset) {
+  const uint8_t* p = pFontData.data() + 8;
   uint32_t nfont = GET_TT_LONG(p);
   uint32_t index;
   for (index = 0; index < nfont; index++) {
-    p = pFontData + 12 + index * 4;
+    p = pFontData.data() + 12 + index * 4;
     if (GET_TT_LONG(p) == font_offset)
       break;
   }
@@ -109,13 +107,13 @@
 RetainPtr<CFX_Face> CFX_FontMgr::GetCachedFace(const ByteString& face_name,
                                                int weight,
                                                bool bItalic,
-                                               uint8_t** pFontData) {
+                                               const uint8_t** pFontData) {
   auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic));
   if (it == m_FaceMap.end())
     return nullptr;
 
   CTTFontDesc* pFontDesc = it->second.get();
-  *pFontData = pFontDesc->FontData();
+  *pFontData = pFontDesc->FontData().data();
   return pdfium::WrapRetain(pFontDesc->GetFace(0));
 }
 
@@ -126,11 +124,11 @@
     std::unique_ptr<uint8_t, FxFreeDeleter> pData,
     uint32_t size,
     int face_index) {
-  RetainPtr<CFX_Face> face = GetFixedFace({pData.get(), size}, face_index);
+  RetainPtr<CFX_Face> face = NewFixedFace({pData.get(), size}, face_index);
   if (!face)
     return nullptr;
 
-  auto pFontDesc = pdfium::MakeUnique<CTTFontDesc>(std::move(pData));
+  auto pFontDesc = pdfium::MakeUnique<CTTFontDesc>(std::move(pData), size);
   pFontDesc->SetFace(0, face.Get());
   m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = std::move(pFontDesc);
   return face;
@@ -144,7 +142,8 @@
     return nullptr;
 
   CTTFontDesc* pFontDesc = it->second.get();
-  int face_index = GetTTCIndex(pFontDesc->FontData(), ttc_size, font_offset);
+  int face_index =
+      GetTTCIndex(pFontDesc->FontData().first(ttc_size), font_offset);
   return pdfium::WrapRetain(pFontDesc->GetFace(face_index));
 }
 
@@ -161,14 +160,15 @@
     pFontDesc = it->second.get();
 
   if (!pFontDesc) {
-    auto pNewDesc = pdfium::MakeUnique<CTTFontDesc>(std::move(pData));
+    auto pNewDesc = pdfium::MakeUnique<CTTFontDesc>(std::move(pData), size);
     pFontDesc = pNewDesc.get();
     m_FaceMap[keyname] = std::move(pNewDesc);
   }
 
-  int face_index = GetTTCIndex(pFontDesc->FontData(), ttc_size, font_offset);
-  RetainPtr<CFX_Face> face = GetFixedFace(
-      {pFontDesc->FontData(), static_cast<size_t>(ttc_size)}, face_index);
+  int face_index =
+      GetTTCIndex(pFontDesc->FontData().first(ttc_size), font_offset);
+  RetainPtr<CFX_Face> face =
+      NewFixedFace(pFontDesc->FontData().first(ttc_size), face_index);
   if (!face)
     return nullptr;
 
@@ -176,7 +176,7 @@
   return face;
 }
 
-RetainPtr<CFX_Face> CFX_FontMgr::GetFixedFace(pdfium::span<const uint8_t> span,
+RetainPtr<CFX_Face> CFX_FontMgr::NewFixedFace(pdfium::span<const uint8_t> span,
                                               int face_index) {
   RetainPtr<CFX_Face> face = CFX_Face::New(m_FTLibrary.get(), span, face_index);
   if (!face)
diff --git a/core/fxge/cfx_fontmgr.h b/core/fxge/cfx_fontmgr.h
index bbbad92..83fa08e 100644
--- a/core/fxge/cfx_fontmgr.h
+++ b/core/fxge/cfx_fontmgr.h
@@ -32,7 +32,7 @@
   RetainPtr<CFX_Face> GetCachedFace(const ByteString& face_name,
                                     int weight,
                                     bool bItalic,
-                                    uint8_t** pFontData);
+                                    const uint8_t** pFontData);
   RetainPtr<CFX_Face> AddCachedFace(
       const ByteString& face_name,
       int weight,
@@ -49,7 +49,7 @@
       std::unique_ptr<uint8_t, FxFreeDeleter> pData,
       uint32_t size,
       uint32_t font_offset);
-  RetainPtr<CFX_Face> GetFixedFace(pdfium::span<const uint8_t> span,
+  RetainPtr<CFX_Face> NewFixedFace(pdfium::span<const uint8_t> span,
                                    int face_index);
   void SetSystemFontInfo(std::unique_ptr<SystemFontInfoIface> pFontInfo);
   RetainPtr<CFX_Face> FindSubstFont(const ByteString& face_name,
diff --git a/core/fxge/cttfontdesc.cpp b/core/fxge/cttfontdesc.cpp
index 27bc770..42c8a60 100644
--- a/core/fxge/cttfontdesc.cpp
+++ b/core/fxge/cttfontdesc.cpp
@@ -10,9 +10,9 @@
 
 #include "core/fxge/cfx_face.h"
 
-CTTFontDesc::CTTFontDesc(std::unique_ptr<uint8_t, FxFreeDeleter> pData)
-    : m_pFontData(std::move(pData)) {
-}
+CTTFontDesc::CTTFontDesc(std::unique_ptr<uint8_t, FxFreeDeleter> pData,
+                         size_t size)
+    : m_pFontData(std::move(pData)), m_Size(size) {}
 
 CTTFontDesc::~CTTFontDesc() = default;
 
diff --git a/core/fxge/cttfontdesc.h b/core/fxge/cttfontdesc.h
index 31a0520..ac57d69 100644
--- a/core/fxge/cttfontdesc.h
+++ b/core/fxge/cttfontdesc.h
@@ -12,20 +12,24 @@
 #include "core/fxcrt/fx_memory.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxcrt/observed_ptr.h"
+#include "third_party/base/span.h"
 
 class CFX_Face;
 
 class CTTFontDesc {
  public:
-  explicit CTTFontDesc(std::unique_ptr<uint8_t, FxFreeDeleter> pData);
+  CTTFontDesc(std::unique_ptr<uint8_t, FxFreeDeleter> pData, size_t size);
   ~CTTFontDesc();
 
-  uint8_t* FontData() const { return m_pFontData.get(); }
+  pdfium::span<const uint8_t> FontData() const {
+    return {m_pFontData.get(), m_Size};
+  }
   void SetFace(size_t index, CFX_Face* face);
   CFX_Face* GetFace(size_t index) const;
 
  private:
   std::unique_ptr<uint8_t, FxFreeDeleter> const m_pFontData;
+  const size_t m_Size;
   ObservedPtr<CFX_Face> m_TTCFaces[16];
 };