Index: src/core/SkConvolver.cpp |
diff --git a/src/core/SkConvolver.cpp b/src/core/SkConvolver.cpp |
index 3a088aa034d3962059ca25a6866e5b6df6db4227..72deeaf2b7975d52c83554abfee74b8e294ee1cb 100644 |
--- a/src/core/SkConvolver.cpp |
+++ b/src/core/SkConvolver.cpp |
@@ -3,6 +3,7 @@ |
// found in the LICENSE file. |
#include "SkConvolver.h" |
+#include "SkMath.h" |
#include "SkSize.h" |
#include "SkTypes.h" |
@@ -358,7 +359,7 @@ const SkConvolutionFilter1D::ConvolutionFixed* SkConvolutionFilter1D::GetSingleF |
return &fFilterValues[filter.fDataLocation]; |
} |
-void BGRAConvolve2D(const unsigned char* sourceData, |
+bool BGRAConvolve2D(const unsigned char* sourceData, |
int sourceByteRowStride, |
bool sourceHasAlpha, |
const SkConvolutionFilter1D& filterX, |
@@ -393,6 +394,20 @@ void BGRAConvolve2D(const unsigned char* sourceData, |
int rowBufferWidth = (filterX.numValues() + 15) & ~0xF; |
int rowBufferHeight = maxYFilterSize + |
(convolveProcs.fConvolve4RowsHorizontally ? 4 : 0); |
+ |
+ // check for too-big allocation requests : crbug.com/528628 |
+ { |
+ int64_t size = sk_64_mul(rowBufferWidth, rowBufferHeight); |
+ // need some limit, to avoid over-committing success from malloc, but then |
+ // crashing when we try to actually use the memory. |
+ // 100meg seems big enough to allow "normal" zoom factors and image sizes through |
+ // while avoiding the crash seen by the bug (crbug.com/528628) |
+ if (size > 100 * 1024 * 1024) { |
+// SkDebugf("BGRAConvolve2D: tmp allocation [%lld] too big\n", size); |
+ return false; |
+ } |
+ } |
+ |
CircularRowBuffer rowBuffer(rowBufferWidth, |
rowBufferHeight, |
filterOffset); |
@@ -486,4 +501,5 @@ void BGRAConvolve2D(const unsigned char* sourceData, |
sourceHasAlpha); |
} |
} |
+ return true; |
} |