diff options
author | Florin Malita <fmalita@chromium.org> | 2018-06-05 17:37:12 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-06 13:02:56 +0000 |
commit | 102c8cf26e2886ba783a2b54827e1f5d1cf0a774 (patch) | |
tree | 1ce640b3886fd5333cbc6f08b30cf739cce6a0d6 | |
parent | 31cb864fdbb5704a2c6f946a1d4aaef433a8f944 (diff) |
Harden SkPerlinNoiseShader StitchData initialization
... to ensure fWrap{X,Y} don't overflow int.
Bug: chromium:846010, oss-fuzz:8377
Change-Id: I7cf082e388002ad5f8a6c62bad92f998fe831385
Reviewed-on: https://skia-review.googlesource.com/132222
Reviewed-by: Kevin Lubick <kjlubick@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
-rw-r--r-- | src/shaders/SkPerlinNoiseShader.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp index d864e165e5..7b457f5b32 100644 --- a/src/shaders/SkPerlinNoiseShader.cpp +++ b/src/shaders/SkPerlinNoiseShader.cpp @@ -75,6 +75,12 @@ public: , fWrapY(0) {} + StitchData(SkScalar w, SkScalar h) + : fWidth(SkTMin(SkScalarRoundToInt(w), SK_MaxS32 - kPerlinNoise)) + , fWrapX(kPerlinNoise + fWidth) + , fHeight(SkTMin(SkScalarRoundToInt(h), SK_MaxS32 - kPerlinNoise)) + , fWrapY(kPerlinNoise + fHeight) {} + bool operator==(const StitchData& other) const { return fWidth == other.fWidth && fWrapX == other.fWrapX && @@ -290,12 +296,8 @@ public: } } // Set up TurbulenceInitial stitch values. - fStitchDataInit.fWidth = - SkScalarRoundToInt(tileWidth * fBaseFrequency.fX); - fStitchDataInit.fWrapX = kPerlinNoise + fStitchDataInit.fWidth; - fStitchDataInit.fHeight = - SkScalarRoundToInt(tileHeight * fBaseFrequency.fY); - fStitchDataInit.fWrapY = kPerlinNoise + fStitchDataInit.fHeight; + fStitchDataInit = StitchData(tileWidth * fBaseFrequency.fX, + tileHeight * fBaseFrequency.fY); } public: @@ -543,10 +545,8 @@ SkScalar SkPerlinNoiseShaderImpl::PerlinNoiseShaderContext::calculateTurbulenceV ratio *= 2; if (perlinNoiseShader.fStitchTiles) { // Update stitch values - stitchData.fWidth *= 2; - stitchData.fWrapX = stitchData.fWidth + kPerlinNoise; - stitchData.fHeight *= 2; - stitchData.fWrapY = stitchData.fHeight + kPerlinNoise; + stitchData = StitchData(SkIntToScalar(stitchData.fWidth) * 2, + SkIntToScalar(stitchData.fHeight) * 2); } } |