aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shaders
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2018-05-18 11:48:50 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-05-18 16:19:44 +0000
commit832aa11e909ac6fdb38c35ec77e4e4fc6fbf286a (patch)
treeba788c4a28eb2a9455413595320a5504fea9af7b /src/shaders
parentdbc90e438766da6a09e6c18e2a052e6f57db6e9e (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>
Diffstat (limited to 'src/shaders')
-rw-r--r--src/shaders/SkPerlinNoiseShader.cpp30
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));