diff options
author | Anand Thakker <anandthakker@users.noreply.github.com> | 2017-06-09 06:28:14 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-09 06:28:14 -0400 |
commit | f59eb822e12b54f74e688a138dc8f4ede1feade8 (patch) | |
tree | 7d0d9039e96fd7ffef8ff89c85c7dcf639737da2 /src/mbgl/programs | |
parent | 66c2a2a0b7c42e1947f57a412ece66fa8eaac149 (diff) | |
download | qtlocation-mapboxgl-f59eb822e12b54f74e688a138dc8f4ede1feade8.tar.gz |
Fix undefined memory access in getCoveringRanges() (#9227)
* Add simple unit tests for SymbolSizeBinder
* Fix bug in symbol size uniform value calculation
For camera functions we were setting the zoom levels in "covering ranges" to
`[(zoom stop <= tile zoom), (zoom stop >= 1 + tile zoom)]`, but then evaluating
the function at `[tile_zoom, tile_zoom + 1]`.
* Check for it != end() before accessing it->first
Diffstat (limited to 'src/mbgl/programs')
-rw-r--r-- | src/mbgl/programs/symbol_program.hpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/mbgl/programs/symbol_program.hpp b/src/mbgl/programs/symbol_program.hpp index 48928988e6..f466a076ef 100644 --- a/src/mbgl/programs/symbol_program.hpp +++ b/src/mbgl/programs/symbol_program.hpp @@ -121,7 +121,7 @@ Range<float> getCoveringStops(Stops s, float lowerZoom, float upperZoom) { // lower_bound yields first element >= lowerZoom, but we want the *last* // element <= lowerZoom, so if we found a stop > lowerZoom, back up by one. - if (minIt != s.stops.begin() && minIt->first > lowerZoom) { + if (minIt != s.stops.begin() && minIt != s.stops.end() && minIt->first > lowerZoom) { minIt--; } return Range<float> { @@ -144,9 +144,10 @@ public: : layoutSize(function_.evaluate(tileZoom + 1)) { function_.stops.match( [&] (const style::ExponentialStops<float>& stops) { + const auto& zoomLevels = getCoveringStops(stops, tileZoom, tileZoom + 1); coveringRanges = std::make_tuple( - getCoveringStops(stops, tileZoom, tileZoom + 1), - Range<float> { function_.evaluate(tileZoom), function_.evaluate(tileZoom + 1) } + zoomLevels, + Range<float> { function_.evaluate(zoomLevels.min), function_.evaluate(zoomLevels.max) } ); functionInterpolationBase = stops.base; }, |