Remove out int args from CPDFLinkExtract::GetTextRange()

Replace with optional range struct based on size_t. Then convert
back to int only at the public API boundary.

Change-Id: Icb9f40919ad78fa0a23de94aa834ba6cf7a16052
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/91510
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdftext/cpdf_linkextract.cpp b/core/fpdftext/cpdf_linkextract.cpp
index 68bca2d..9cffa34 100644
--- a/core/fpdftext/cpdf_linkextract.cpp
+++ b/core/fpdftext/cpdf_linkextract.cpp
@@ -168,7 +168,7 @@
           maybe_link.value().m_Start += start;
           m_LinkArray.push_back(maybe_link.value());
         } else if (CheckMailLink(&strBeCheck)) {
-          m_LinkArray.push_back(Link{start, nCount, strBeCheck});
+          m_LinkArray.push_back(Link{{start, nCount}, strBeCheck});
         }
       }
     }
@@ -203,7 +203,7 @@
         if (end > off) {  // Non-empty host name.
           const size_t nStart = start.value();
           const size_t nCount = end - nStart + 1;
-          return Link{nStart, nCount, strBeCheck.Substr(nStart, nCount)};
+          return Link{{nStart, nCount}, strBeCheck.Substr(nStart, nCount)};
         }
       }
     }
@@ -221,7 +221,7 @@
       if (end > off) {
         const size_t nStart = start.value();
         const size_t nCount = end - nStart + 1;
-        return Link{nStart, nCount,
+        return Link{{nStart, nCount},
                     L"http://" + strBeCheck.Substr(nStart, nCount)};
       }
     }
@@ -311,12 +311,9 @@
                                    m_LinkArray[index].m_Count);
 }
 
-bool CPDF_LinkExtract::GetTextRange(size_t index,
-                                    int* start_char_index,
-                                    int* char_count) const {
+absl::optional<CPDF_LinkExtract::Range> CPDF_LinkExtract::GetTextRange(
+    size_t index) const {
   if (index >= m_LinkArray.size())
-    return false;
-  *start_char_index = m_LinkArray[index].m_Start;
-  *char_count = m_LinkArray[index].m_Count;
-  return true;
+    return absl::nullopt;
+  return m_LinkArray[index];
 }
diff --git a/core/fpdftext/cpdf_linkextract.h b/core/fpdftext/cpdf_linkextract.h
index d44db70..84f7dac 100644
--- a/core/fpdftext/cpdf_linkextract.h
+++ b/core/fpdftext/cpdf_linkextract.h
@@ -21,6 +21,11 @@
 
 class CPDF_LinkExtract {
  public:
+  struct Range {
+    size_t m_Start;
+    size_t m_Count;
+  };
+
   explicit CPDF_LinkExtract(const CPDF_TextPage* pTextPage);
   ~CPDF_LinkExtract();
 
@@ -28,12 +33,10 @@
   size_t CountLinks() const { return m_LinkArray.size(); }
   WideString GetURL(size_t index) const;
   std::vector<CFX_FloatRect> GetRects(size_t index) const;
-  bool GetTextRange(size_t index, int* start_char_index, int* char_count) const;
+  absl::optional<Range> GetTextRange(size_t index) const;
 
  protected:
-  struct Link {
-    size_t m_Start;
-    size_t m_Count;
+  struct Link : public Range {
     WideString m_strUrl;
   };
 
diff --git a/fpdfsdk/fpdf_text.cpp b/fpdfsdk/fpdf_text.cpp
index d7420ee..da00c47 100644
--- a/fpdfsdk/fpdf_text.cpp
+++ b/fpdfsdk/fpdf_text.cpp
@@ -521,7 +521,14 @@
     return false;
 
   CPDF_LinkExtract* page_link = CPDFLinkExtractFromFPDFPageLink(link_page);
-  return page_link->GetTextRange(link_index, start_char_index, char_count);
+  auto maybe_range = page_link->GetTextRange(link_index);
+  if (!maybe_range.has_value())
+    return false;
+
+  *start_char_index =
+      pdfium::base::checked_cast<int>(maybe_range.value().m_Start);
+  *char_count = pdfium::base::checked_cast<int>(maybe_range.value().m_Count);
+  return true;
 }
 
 FPDF_EXPORT void FPDF_CALLCONV FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page) {