aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2014-11-21 11:38:53 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2014-11-21 11:38:53 -0800
commit09a22e9597e271c44dc7c2b71c72cf62a7de1e19 (patch)
tree04e988c03aa87cdf3695740d53a43f2a783f7a58
parent04038eba9f4e09724031c69146699f9c6e15748e (diff)
Watch out for SkFixed overflow in SkMipMap.cpp.
Tested with -fsanitize=signed-integer-overflow. This new assert used to trigger in MipMap unit test. Don't appear to be any GM diffs. BUG=skia: Review URL: https://codereview.chromium.org/729373004
-rw-r--r--include/core/SkTypes.h1
-rw-r--r--src/core/SkMipMap.cpp6
2 files changed, 6 insertions, 1 deletions
diff --git a/include/core/SkTypes.h b/include/core/SkTypes.h
index 0e9e230349..a38be84d8f 100644
--- a/include/core/SkTypes.h
+++ b/include/core/SkTypes.h
@@ -352,6 +352,7 @@ template <typename T> inline void SkTSwap(T& a, T& b) {
}
static inline int32_t SkAbs32(int32_t value) {
+ SkASSERT(value != SK_NaN32); // The most negative int32_t can't be negated.
if (value < 0) {
value = -value;
}
diff --git a/src/core/SkMipMap.cpp b/src/core/SkMipMap.cpp
index fdfb660ccc..83164b1526 100644
--- a/src/core/SkMipMap.cpp
+++ b/src/core/SkMipMap.cpp
@@ -228,7 +228,11 @@ SkMipMap* SkMipMap::Build(const SkBitmap& src, SkDiscardableFactoryProc fact) {
//static int gCounter;
static SkFixed compute_level(SkScalar scale) {
- SkFixed s = SkAbs32(SkScalarToFixed(SkScalarInvert(scale)));
+ SkScalar inv = SkScalarAbs(SkScalarInvert(scale));
+ if (inv > 32767) { // Watch out for SkFixed overflow.
+ inv = 32767;
+ }
+ SkFixed s = SkScalarToFixed(inv);
if (s < SK_Fixed1) {
return 0;