diff options
author | Mike Reed <reed@google.com> | 2018-05-18 11:48:50 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-05-18 16:19:44 +0000 |
commit | 832aa11e909ac6fdb38c35ec77e4e4fc6fbf286a (patch) | |
tree | ba788c4a28eb2a9455413595320a5504fea9af7b | |
parent | dbc90e438766da6a09e6c18e2a052e6f57db6e9e (diff) |
validate perlin inputs
Bug: oss-fuzz:8359
Change-Id: Ib539c8549f2e00d6b0da099f48c4084d2bfbefd8
Reviewed-on: https://skia-review.googlesource.com/129180
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
-rw-r--r-- | src/shaders/SkPerlinNoiseShader.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp index 4895683527..d864e165e5 100644 --- a/src/shaders/SkPerlinNoiseShader.cpp +++ b/src/shaders/SkPerlinNoiseShader.cpp @@ -430,10 +430,6 @@ sk_sp<SkFlattenable> SkPerlinNoiseShaderImpl::CreateProc(SkReadBuffer& buffer) { SkScalar freqX = buffer.readScalar(); SkScalar freqY = buffer.readScalar(); - if (!buffer.validate(freqX >= 0 && freqY >= 0)) { - return nullptr; - } - int octaves = buffer.read32LE<int>(kMaxOctaves); SkScalar seed = buffer.readScalar(); @@ -1514,10 +1510,30 @@ void SkPerlinNoiseShaderImpl::toString(SkString* str) const { /////////////////////////////////////////////////////////////////////////////////////////////////// +static bool valid_input(SkScalar baseX, SkScalar baseY, int numOctaves, const SkISize* tileSize, + SkScalar seed) { + if (!(baseX >= 0 && baseY >= 0)) { + return false; + } + if (!(numOctaves >= 0 && numOctaves <= SkPerlinNoiseShaderImpl::kMaxOctaves)) { + return false; + } + if (tileSize && !(tileSize->width() >= 0 && tileSize->height() >= 0)) { + return false; + } + if (!SkScalarIsFinite(seed)) { + return false; + } + return true; +} + sk_sp<SkShader> SkPerlinNoiseShader::MakeFractalNoise(SkScalar baseFrequencyX, SkScalar baseFrequencyY, int numOctaves, SkScalar seed, const SkISize* tileSize) { + if (!valid_input(baseFrequencyX, baseFrequencyY, numOctaves, tileSize, seed)) { + return nullptr; + } return sk_sp<SkShader>(new SkPerlinNoiseShaderImpl(SkPerlinNoiseShaderImpl::kFractalNoise_Type, baseFrequencyX, baseFrequencyY, numOctaves, seed, tileSize)); @@ -1527,6 +1543,9 @@ sk_sp<SkShader> SkPerlinNoiseShader::MakeTurbulence(SkScalar baseFrequencyX, SkScalar baseFrequencyY, int numOctaves, SkScalar seed, const SkISize* tileSize) { + if (!valid_input(baseFrequencyX, baseFrequencyY, numOctaves, tileSize, seed)) { + return nullptr; + } return sk_sp<SkShader>(new SkPerlinNoiseShaderImpl(SkPerlinNoiseShaderImpl::kTurbulence_Type, baseFrequencyX, baseFrequencyY, numOctaves, seed, tileSize)); @@ -1535,6 +1554,9 @@ sk_sp<SkShader> SkPerlinNoiseShader::MakeTurbulence(SkScalar baseFrequencyX, sk_sp<SkShader> SkPerlinNoiseShader::MakeImprovedNoise(SkScalar baseFrequencyX, SkScalar baseFrequencyY, int numOctaves, SkScalar z) { + if (!valid_input(baseFrequencyX, baseFrequencyY, numOctaves, nullptr, z)) { + return nullptr; + } return sk_sp<SkShader>(new SkPerlinNoiseShaderImpl(SkPerlinNoiseShaderImpl::kImprovedNoise_Type, baseFrequencyX, baseFrequencyY, numOctaves, z, nullptr)); |