Chromium Code Reviews| Index: src/effects/SkMatrixConvolutionImageFilter.cpp |
| diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp |
| index 909facb0c973c2ff77df89dfcddb2a1aca269bf4..cac30e6a491853ab9907a34cd3df68ba2fa52736 100644 |
| --- a/src/effects/SkMatrixConvolutionImageFilter.cpp |
| +++ b/src/effects/SkMatrixConvolutionImageFilter.cpp |
| @@ -61,17 +61,27 @@ SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(SkFlattenableRead |
| : INHERITED(buffer) { |
| fKernelSize.fWidth = buffer.readInt(); |
| fKernelSize.fHeight = buffer.readInt(); |
| - uint32_t size = fKernelSize.fWidth * fKernelSize.fHeight; |
| - fKernel = SkNEW_ARRAY(SkScalar, size); |
| - SkDEBUGCODE(uint32_t readSize = )buffer.readScalarArray(fKernel); |
| - SkASSERT(readSize == size); |
| + if ((fKernelSize.fWidth >= 1) && (fKernelSize.fHeight >= 1) && |
| + // Make sure size won't be larger than a signed int, |
| + // which would still be extremely large for a kernel, |
| + // but we don't impose a hard limit for kernel size |
| + (SK_MaxS32 / fKernelSize.fWidth >= fKernelSize.fHeight)) { |
| + uint32_t size = fKernelSize.fWidth * fKernelSize.fHeight; |
| + fKernel = SkNEW_ARRAY(SkScalar, size); |
| + uint32_t readSize = buffer.readScalarArray(fKernel); |
|
Stephen White
2013/10/23 18:09:35
Shouldn't we be passing an expected size to readSc
sugoi1
2013/10/23 18:17:08
Yes, a few of these functions need to be fixed (al
|
| + SkASSERT(readSize == size); |
| + buffer.validate(readSize == size); |
| + } else { |
| + fKernel = 0; |
| + } |
| fGain = buffer.readScalar(); |
| fBias = buffer.readScalar(); |
| fTarget.fX = buffer.readInt(); |
| fTarget.fY = buffer.readInt(); |
| fTileMode = (TileMode) buffer.readInt(); |
| fConvolveAlpha = buffer.readBool(); |
| - buffer.validate(SkScalarIsFinite(fGain) && |
| + buffer.validate((fKernel != 0) && |
| + SkScalarIsFinite(fGain) && |
| SkScalarIsFinite(fBias) && |
| tile_mode_is_valid(fTileMode)); |
| } |