Add CPDF_TextPage::size().

Use it in fpdf_text.cpp. Consolidate checks for indices there.

Change-Id: Iafeff30d30f54661df311d61f0f95b0e7dd760e0
Reviewed-on: https://pdfium-review.googlesource.com/c/50550
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 6b0a72e..8ac04c9 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -456,8 +456,8 @@
   });
 }
 
-void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO* info) const {
-  if (!m_bIsParsed || !pdfium::IndexInBounds(m_CharList, index))
+void CPDF_TextPage::GetCharInfo(size_t index, FPDF_CHAR_INFO* info) const {
+  if (!m_bIsParsed || index >= size())
     return;
 
   const PAGECHAR_INFO& charinfo = m_CharList[index];
diff --git a/core/fpdftext/cpdf_textpage.h b/core/fpdftext/cpdf_textpage.h
index e10b45d..00f0426 100644
--- a/core/fpdftext/cpdf_textpage.h
+++ b/core/fpdftext/cpdf_textpage.h
@@ -89,8 +89,9 @@
   bool IsParsed() const { return m_bIsParsed; }
   int CharIndexFromTextIndex(int TextIndex) const;
   int TextIndexFromCharIndex(int CharIndex) const;
+  size_t size() const { return m_CharList.size(); }
   int CountChars() const;
-  void GetCharInfo(int index, FPDF_CHAR_INFO* info) const;
+  void GetCharInfo(size_t index, FPDF_CHAR_INFO* info) const;
   std::vector<CFX_FloatRect> GetRectArray(int start, int nCount) const;
   int GetIndexAtPos(const CFX_PointF& point, const CFX_SizeF& tolerance) const;
   WideString GetTextByRect(const CFX_FloatRect& rect) const;
diff --git a/fpdfsdk/fpdf_text.cpp b/fpdfsdk/fpdf_text.cpp
index 939dd01..a6e5c5f 100644
--- a/fpdfsdk/fpdf_text.cpp
+++ b/fpdfsdk/fpdf_text.cpp
@@ -35,6 +35,14 @@
 
 constexpr size_t kBytesPerCharacter = sizeof(unsigned short);
 
+CPDF_TextPage* GetTextPageForValidIndex(FPDF_TEXTPAGE text_page, int index) {
+  if (!text_page || index < 0)
+    return nullptr;
+
+  CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
+  return static_cast<size_t>(index) < textpage->size() ? textpage : nullptr;
+}
+
 }  // namespace
 
 FPDF_EXPORT FPDF_TEXTPAGE FPDF_CALLCONV FPDFText_LoadPage(FPDF_PAGE page) {
@@ -64,11 +72,8 @@
 
 FPDF_EXPORT unsigned int FPDF_CALLCONV
 FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index) {
-  if (!text_page)
-    return 0;
-
-  CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
-  if (index < 0 || index >= textpage->CountChars())
+  CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
+  if (!textpage)
     return 0;
 
   FPDF_CHAR_INFO charinfo;
@@ -78,11 +83,8 @@
 
 FPDF_EXPORT double FPDF_CALLCONV FPDFText_GetFontSize(FPDF_TEXTPAGE text_page,
                                                       int index) {
-  if (!text_page)
-    return 0;
-  CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
-
-  if (index < 0 || index >= textpage->CountChars())
+  CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
+  if (!textpage)
     return 0;
 
   FPDF_CHAR_INFO charinfo;
@@ -96,15 +98,12 @@
                      void* buffer,
                      unsigned long buflen,
                      int* flags) {
-  if (!text_page)
-    return 0;
-  CPDF_TextPage* pTextObj = CPDFTextPageFromFPDFTextPage(text_page);
-
-  if (index < 0 || index >= pTextObj->CountChars())
+  CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
+  if (!textpage)
     return 0;
 
   FPDF_CHAR_INFO charinfo;
-  pTextObj->GetCharInfo(index, &charinfo);
+  textpage->GetCharInfo(index, &charinfo);
   if (!charinfo.m_pTextObj)
     return 0;
 
@@ -127,11 +126,8 @@
                                                         double* right,
                                                         double* bottom,
                                                         double* top) {
-  if (!text_page || index < 0)
-    return false;
-
-  CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
-  if (index >= textpage->CountChars())
+  CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
+  if (!textpage)
     return false;
 
   FPDF_CHAR_INFO charinfo;
@@ -148,12 +144,10 @@
                        int index,
                        double* x,
                        double* y) {
-  if (!text_page)
+  CPDF_TextPage* textpage = GetTextPageForValidIndex(text_page, index);
+  if (!textpage)
     return false;
-  CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page);
 
-  if (index < 0 || index >= textpage->CountChars())
-    return false;
   FPDF_CHAR_INFO charinfo;
   textpage->GetCharInfo(index, &charinfo);
   *x = charinfo.m_Origin.x;