diff options
author | Mike Reed <reed@google.com> | 2018-02-26 13:13:52 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-02-26 18:34:08 +0000 |
commit | 339650c227b7d19b1e448444ed6e1bc64b4b11fa (patch) | |
tree | e43f1ce52768dc6a3fbb9e9a5b60bcd276b7faa6 /src | |
parent | ec84612c09ec60a93d7a736e6b0818cab6a5c8ec (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')
-rw-r--r-- | src/effects/SkArithmeticImageFilter.cpp | 6 |
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(); |