Do more validation in CPDF_Annot quad point methods.
CPDF_Annot::BoundingRectFromQuadPoints() and
CPDF_Annot::RectFromQuadPoints() should handle out of bound indices
gracefully, rather than hitting an ASSERT().
BUG=pdfium:1198
Change-Id: I548691dc4110ff509e94a9e961bd760fa10e505f
Reviewed-on: https://pdfium-review.googlesource.com/c/46412
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp
index 39707b8..ee15879 100644
--- a/core/fpdfdoc/cpdf_annot.cpp
+++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -234,11 +234,11 @@
const CPDF_Dictionary* pAnnotDict) {
CFX_FloatRect ret;
const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
- if (!pArray)
+ size_t nQuadPointCount = pArray ? QuadPointCount(pArray) : 0;
+ if (nQuadPointCount == 0)
return ret;
ret = RectFromQuadPointsArray(pArray, 0);
- size_t nQuadPointCount = QuadPointCount(pArray);
for (size_t i = 1; i < nQuadPointCount; ++i) {
CFX_FloatRect rect = RectFromQuadPointsArray(pArray, i);
ret.Union(rect);
@@ -250,7 +250,8 @@
CFX_FloatRect CPDF_Annot::RectFromQuadPoints(const CPDF_Dictionary* pAnnotDict,
size_t nIndex) {
const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
- if (!pArray)
+ size_t nQuadPointCount = pArray ? QuadPointCount(pArray) : 0;
+ if (nIndex >= nQuadPointCount)
return CFX_FloatRect();
return RectFromQuadPointsArray(pArray, nIndex);
}
diff --git a/core/fpdfdoc/cpdf_annot_unittest.cpp b/core/fpdfdoc/cpdf_annot_unittest.cpp
index 287f034..40817f4 100644
--- a/core/fpdfdoc/cpdf_annot_unittest.cpp
+++ b/core/fpdfdoc/cpdf_annot_unittest.cpp
@@ -48,6 +48,13 @@
EXPECT_EQ(0.0f, rect.right);
EXPECT_EQ(0.0f, rect.top);
+ dict.SetFor("QuadPoints", CreateQuadPointArrayFromVector({0, 1, 2}));
+ rect = CPDF_Annot::BoundingRectFromQuadPoints(&dict);
+ EXPECT_EQ(0.0f, rect.left);
+ EXPECT_EQ(0.0f, rect.bottom);
+ EXPECT_EQ(0.0f, rect.right);
+ EXPECT_EQ(0.0f, rect.top);
+
dict.SetFor("QuadPoints",
CreateQuadPointArrayFromVector({0, 1, 2, 3, 4, 5, 6, 7}));
rect = CPDF_Annot::BoundingRectFromQuadPoints(&dict);
@@ -86,6 +93,11 @@
EXPECT_EQ(5.0f, rect.bottom);
EXPECT_EQ(2.0f, rect.right);
EXPECT_EQ(3.0f, rect.top);
+ rect = CPDF_Annot::RectFromQuadPoints(&dict, 5);
+ EXPECT_EQ(0.0f, rect.left);
+ EXPECT_EQ(0.0f, rect.bottom);
+ EXPECT_EQ(0.0f, rect.right);
+ EXPECT_EQ(0.0f, rect.top);
dict.SetFor("QuadPoints", CreateQuadPointArrayFromVector(
{0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5,