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;