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,