aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2018-02-26 13:13:52 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-02-26 18:34:08 +0000
commit339650c227b7d19b1e448444ed6e1bc64b4b11fa (patch)
treee43f1ce52768dc6a3fbb9e9a5b60bcd276b7faa6 /src/effects
parentec84612c09ec60a93d7a736e6b0818cab6a5c8ec (diff)
use SkIRect makeOffset to avoid overflows
Bug: oss-fuzz:7657 Change-Id: I7917306cf0a158d2e1f36611e85ef26028da9954 Reviewed-on: https://skia-review.googlesource.com/110280 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/effects')
-rw-r--r--src/effects/SkArithmeticImageFilter.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/effects/SkArithmeticImageFilter.cpp b/src/effects/SkArithmeticImageFilter.cpp
index f3d0f035fb..d78550aba7 100644
--- a/src/effects/SkArithmeticImageFilter.cpp
+++ b/src/effects/SkArithmeticImageFilter.cpp
@@ -379,6 +379,8 @@ void ArithmeticImageFilterImpl::drawForeground(SkCanvas* canvas, SkSpecialImage*
SkASSERT(ctm.getType() <= SkMatrix::kTranslate_Mask);
const int dx = SkScalarRoundToInt(ctm.getTranslateX());
const int dy = SkScalarRoundToInt(ctm.getTranslateY());
+ // be sure to perform this offset using SkIRect, since it saturates to avoid overflows
+ const SkIRect fgoffset = fgBounds.makeOffset(dx, dy);
if (img) {
SkBitmap srcBM;
@@ -392,7 +394,7 @@ void ArithmeticImageFilterImpl::drawForeground(SkCanvas* canvas, SkSpecialImage*
auto proc = fEnforcePMColor ? arith_span<true> : arith_span<false>;
SkPixmap tmpDst = dst;
- if (intersect(&tmpDst, &src, fgBounds.fLeft + dx, fgBounds.fTop + dy)) {
+ if (intersect(&tmpDst, &src, fgoffset.fLeft, fgoffset.fTop)) {
for (int y = 0; y < tmpDst.height(); ++y) {
proc(fK, tmpDst.writable_addr32(0, y), src.addr32(0, y), tmpDst.width());
}
@@ -401,7 +403,7 @@ void ArithmeticImageFilterImpl::drawForeground(SkCanvas* canvas, SkSpecialImage*
// Now apply the mode with transparent-color to the outside of the fg image
SkRegion outside(SkIRect::MakeWH(dst.width(), dst.height()));
- outside.op(fgBounds.makeOffset(dx, dy), SkRegion::kDifference_Op);
+ outside.op(fgoffset, SkRegion::kDifference_Op);
auto proc = fEnforcePMColor ? arith_transparent<true> : arith_transparent<false>;
for (SkRegion::Iterator iter(outside); !iter.done(); iter.next()) {
const SkIRect r = iter.rect();