diff options
author | Robert Phillips <robertphillips@google.com> | 2018-01-24 14:46:38 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-01-24 21:54:30 +0000 |
commit | a83d0132baa681339e7e7f018dbdcc4051caae3d (patch) | |
tree | e9be321a81d04cc28a5c388a6f8a8f76ee5a1224 /src | |
parent | 548d387ab935349edd03149502fff8ebe467b5b0 (diff) | |
download | skqp-a83d0132baa681339e7e7f018dbdcc4051caae3d.tar.gz |
Misc guarding of enums in ImageFilter CreateProcs
Change-Id: I51886aaf2a4670f46ca489b2369dc00e60403c75
Reviewed-on: https://skia-review.googlesource.com/99328
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkBlurImageFilter.cpp | 4 | ||||
-rw-r--r-- | src/core/SkMatrix.cpp | 6 | ||||
-rw-r--r-- | src/core/SkMatrixImageFilter.cpp | 12 | ||||
-rw-r--r-- | src/effects/SkBlurMaskFilter.cpp | 18 | ||||
-rw-r--r-- | src/effects/SkDropShadowImageFilter.cpp | 11 | ||||
-rw-r--r-- | src/effects/SkHighContrastFilter.cpp | 10 |
6 files changed, 45 insertions, 16 deletions
diff --git a/src/core/SkBlurImageFilter.cpp b/src/core/SkBlurImageFilter.cpp index e81a11eba0..556508ee27 100644 --- a/src/core/SkBlurImageFilter.cpp +++ b/src/core/SkBlurImageFilter.cpp @@ -122,6 +122,10 @@ sk_sp<SkFlattenable> SkBlurImageFilterImpl::CreateProc(SkReadBuffer& buffer) { static_assert(SkBlurImageFilter::kLast_TileMode == 2, "CreateProc"); + if (!buffer.validate(safe)) { + return nullptr; + } + return SkBlurImageFilter::Make( sigmaX, sigmaY, common.getInput(0), &common.cropRect(), tileMode); } diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp index 8e0639c7e8..9a70fbbc7d 100644 --- a/src/core/SkMatrix.cpp +++ b/src/core/SkMatrix.cpp @@ -1655,10 +1655,8 @@ size_t SkMatrix::readFromMemory(const void* buffer, size_t length) { if (length < sizeInMemory) { return 0; } - if (buffer) { - memcpy(fMat, buffer, sizeInMemory); - this->setTypeMask(kUnknown_Mask); - } + memcpy(fMat, buffer, sizeInMemory); + this->setTypeMask(kUnknown_Mask); return sizeInMemory; } diff --git a/src/core/SkMatrixImageFilter.cpp b/src/core/SkMatrixImageFilter.cpp index 3531d183cc..1a5ca7ccf9 100644 --- a/src/core/SkMatrixImageFilter.cpp +++ b/src/core/SkMatrixImageFilter.cpp @@ -11,6 +11,7 @@ #include "SkColorSpaceXformer.h" #include "SkImageFilterPriv.h" #include "SkReadBuffer.h" +#include "SkSafeRange.h" #include "SkSpecialImage.h" #include "SkSpecialSurface.h" #include "SkWriteBuffer.h" @@ -33,10 +34,19 @@ sk_sp<SkImageFilter> SkMatrixImageFilter::Make(const SkMatrix& transform, } sk_sp<SkFlattenable> SkMatrixImageFilter::CreateProc(SkReadBuffer& buffer) { + SkSafeRange safe; + SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); SkMatrix matrix; buffer.readMatrix(&matrix); - SkFilterQuality quality = static_cast<SkFilterQuality>(buffer.readInt()); + + SkFilterQuality quality = safe.checkLE<SkFilterQuality>(buffer.readInt(), + kLast_SkFilterQuality); + + if (!buffer.validate(safe)) { + return nullptr; + } + return Make(matrix, quality, common.getInput(0)); } diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index d730d62d14..866e724190 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -10,6 +10,7 @@ #include "SkGpuBlurUtils.h" #include "SkMaskFilterBase.h" #include "SkReadBuffer.h" +#include "SkSafeRange.h" #include "SkWriteBuffer.h" #include "SkMaskFilter.h" #include "SkRRect.h" @@ -733,22 +734,21 @@ void SkBlurMaskFilterImpl::computeFastBounds(const SkRect& src, } sk_sp<SkFlattenable> SkBlurMaskFilterImpl::CreateProc(SkReadBuffer& buffer) { - const SkScalar sigma = buffer.readScalar(); - const unsigned style = buffer.readUInt(); - unsigned flags = buffer.readUInt(); + SkSafeRange safe; - buffer.validate(style <= kLastEnum_SkBlurStyle); - buffer.validate(!(flags & ~SkBlurMaskFilter::kAll_BlurFlag)); + const SkScalar sigma = buffer.readScalar(); - flags &= SkBlurMaskFilter::kAll_BlurFlag; + SkBlurStyle style = safe.checkLE(buffer.readUInt(), kLastEnum_SkBlurStyle); + unsigned flags = safe.checkLE(buffer.readUInt(), SkBlurMaskFilter::kAll_BlurFlag); SkRect occluder; buffer.readRect(&occluder); - if (style <= kLastEnum_SkBlurStyle) { - return SkBlurMaskFilter::Make((SkBlurStyle)style, sigma, occluder, flags); + if (!buffer.validate(safe)) { + return nullptr; } - return nullptr; + + return SkBlurMaskFilter::Make((SkBlurStyle)style, sigma, occluder, flags); } void SkBlurMaskFilterImpl::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkDropShadowImageFilter.cpp b/src/effects/SkDropShadowImageFilter.cpp index ab1b2a5c7e..bd0fb75353 100644 --- a/src/effects/SkDropShadowImageFilter.cpp +++ b/src/effects/SkDropShadowImageFilter.cpp @@ -12,6 +12,7 @@ #include "SkColorSpaceXformer.h" #include "SkImageFilterPriv.h" #include "SkReadBuffer.h" +#include "SkSafeRange.h" #include "SkSpecialImage.h" #include "SkSpecialSurface.h" #include "SkWriteBuffer.h" @@ -41,13 +42,21 @@ SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, } sk_sp<SkFlattenable> SkDropShadowImageFilter::CreateProc(SkReadBuffer& buffer) { + SkSafeRange safe; + SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); SkScalar dx = buffer.readScalar(); SkScalar dy = buffer.readScalar(); SkScalar sigmaX = buffer.readScalar(); SkScalar sigmaY = buffer.readScalar(); SkColor color = buffer.readColor(); - ShadowMode shadowMode = static_cast<ShadowMode>(buffer.readInt()); + + ShadowMode shadowMode = safe.checkLE<ShadowMode>(buffer.readInt(), kLast_ShadowMode); + + if (!buffer.validate(safe)) { + return nullptr; + } + return Make(dx, dy, sigmaX, sigmaY, color, shadowMode, common.getInput(0), &common.cropRect()); } diff --git a/src/effects/SkHighContrastFilter.cpp b/src/effects/SkHighContrastFilter.cpp index 9df04c110b..69cbcd7a9c 100644 --- a/src/effects/SkHighContrastFilter.cpp +++ b/src/effects/SkHighContrastFilter.cpp @@ -9,6 +9,7 @@ #include "SkPM4f.h" #include "SkArenaAlloc.h" #include "SkRasterPipeline.h" +#include "SkSafeRange.h" #include "SkReadBuffer.h" #include "SkString.h" #include "SkWriteBuffer.h" @@ -141,10 +142,17 @@ void SkHighContrast_Filter::flatten(SkWriteBuffer& buffer) const { } sk_sp<SkFlattenable> SkHighContrast_Filter::CreateProc(SkReadBuffer& buffer) { + SkSafeRange safe; + SkHighContrastConfig config; config.fGrayscale = buffer.readBool(); - config.fInvertStyle = static_cast<InvertStyle>(buffer.readInt()); + config.fInvertStyle = safe.checkLE<InvertStyle>(buffer.readInt(), InvertStyle::kLast); config.fContrast = buffer.readScalar(); + + if (!buffer.validate(safe)) { + return nullptr; + } + return SkHighContrastFilter::Make(config); } |