Harden runtime shader/colorfilter CreateProc against bad child counts

Change-Id: I7d2f32a8cd4d373afddb2f1bfdb736e2979ec000
Bug: oss-fuzz:19883
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/270637
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp
index 27d8bee..edd5869 100644
--- a/src/core/SkColorFilter.cpp
+++ b/src/core/SkColorFilter.cpp
@@ -484,17 +484,24 @@
     buffer.readString(&sksl);
     sk_sp<SkData> inputs = buffer.readByteArrayAsData();
 
-    std::vector<sk_sp<SkColorFilter>> children;
-    children.resize(buffer.read32());
-    for (size_t i = 0; i < children.size(); ++i) {
-        children[i] = buffer.readColorFilter();
-    }
-
     auto effect = std::get<0>(SkRuntimeEffect::Make(std::move(sksl)));
     if (!effect) {
+        buffer.validate(false);
         return nullptr;
     }
 
+    size_t childCount = buffer.read32();
+    if (childCount != effect->children().count()) {
+        buffer.validate(false);
+        return nullptr;
+    }
+
+    std::vector<sk_sp<SkColorFilter>> children;
+    children.resize(childCount);
+    for (size_t i = 0; i < children.size(); ++i) {
+        children[i] = buffer.readColorFilter();
+    }
+
     return effect->makeColorFilter(std::move(inputs), children.data(), children.size());
 }
 
diff --git a/src/shaders/SkRTShader.cpp b/src/shaders/SkRTShader.cpp
index f1a32ed..3e961e0 100644
--- a/src/shaders/SkRTShader.cpp
+++ b/src/shaders/SkRTShader.cpp
@@ -110,17 +110,24 @@
         localMPtr = &localM;
     }
 
-    std::vector<sk_sp<SkShader>> children;
-    children.resize(buffer.read32());
-    for (size_t i = 0; i < children.size(); ++i) {
-        children[i] = buffer.readShader();
-    }
-
     auto effect = std::get<0>(SkRuntimeEffect::Make(std::move(sksl)));
     if (!effect) {
+        buffer.validate(false);
         return nullptr;
     }
 
+    size_t childCount = buffer.read32();
+    if (childCount != effect->children().count()) {
+        buffer.validate(false);
+        return nullptr;
+    }
+
+    std::vector<sk_sp<SkShader>> children;
+    children.resize(childCount);
+    for (size_t i = 0; i < children.size(); ++i) {
+        children[i] = buffer.readShader();
+    }
+
     return effect->makeShader(std::move(inputs), children.data(), children.size(), localMPtr,
                               isOpaque);
 }