From dd7b3947c4694adc682039c19cd3d9ad5bdd7b89 Mon Sep 17 00:00:00 2001 From: Molly Lloyd Date: Fri, 14 Sep 2018 15:09:25 -0700 Subject: [PATCH] prevent crash when expression evaluates to default, no pattern --- mapbox-gl-js | 2 +- src/mbgl/renderer/paint_property_binder.hpp | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/mapbox-gl-js b/mapbox-gl-js index f66cead4b8f..d38ade8f156 160000 --- a/mapbox-gl-js +++ b/mapbox-gl-js @@ -1 +1 @@ -Subproject commit f66cead4b8f95c696d7d2636f36cafaf4a4c6bc3 +Subproject commit d38ade8f156d923da58b68923e56266d07f2d1a6 diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp index 391ecbb174e..31abec68a9d 100644 --- a/src/mbgl/renderer/paint_property_binder.hpp +++ b/src/mbgl/renderer/paint_property_binder.hpp @@ -302,8 +302,17 @@ class CompositeCrossFadedPaintPropertyBinder : public PaintPropertyBinder& patternDependencies) override { - if (!patternDependencies) return; - if (!patternPositions.empty()) { + + if (patternDependencies->mid.empty()) { + // Unlike other propperties with expressions that evaluate to null, the default value for `*-pattern` properties is an empty + // string and will not have a valid entry in patternPositions. We still need to populate the attribute buffers to avoid crashes + // when we try to draw the layer because we don't know at draw time if all features were evaluated to valid pattern dependencies. + for (std::size_t i = zoomInVertexVector.vertexSize(); i < length; ++i) { + patternToVertexVector.emplace_back(Vertex { std::array{{0, 0, 0, 0}} }); + zoomInVertexVector.emplace_back(Vertex2 { std::array{{0, 0, 0, 0}} } ); + zoomOutVertexVector.emplace_back(Vertex2 { std::array{{0, 0, 0, 0}} }); + } + } else if (!patternPositions.empty()) { const auto min = patternPositions.find(patternDependencies->min); const auto mid = patternPositions.find(patternDependencies->mid); const auto max = patternPositions.find(patternDependencies->max);