Index: src/effects/SkDashPathEffect.cpp |
diff --git a/src/effects/SkDashPathEffect.cpp b/src/effects/SkDashPathEffect.cpp |
index 90af32ec5b0fb6686699271f2c888704207a65d4..30d7667d178ecaa4220657c5fc01eda285a2aab3 100644 |
--- a/src/effects/SkDashPathEffect.cpp |
+++ b/src/effects/SkDashPathEffect.cpp |
@@ -248,7 +248,14 @@ bool SkDashPathEffect::asPoints(PointData* results, |
len2 -= clampedInitialDashLength; // skip initial partial empty |
} |
} |
- int numMidPoints = SkScalarFloorToInt(len2 / fIntervalLength); |
+ // Too many midpoints can cause results->fNumPoints to overflow or |
+ // otherwise cause the results->fPoints allocation below to OOM. |
+ // Cap it to a sane value. |
+ SkScalar numIntervals = len2 / fIntervalLength; |
+ if (!SkScalarIsFinite(numIntervals) || numIntervals > SkDashPath::kMaxDashCount) { |
+ return false; |
+ } |
+ int numMidPoints = SkScalarFloorToInt(numIntervals); |
results->fNumPoints += numMidPoints; |
len2 -= numMidPoints * fIntervalLength; |
bool partialLast = false; |