diff --git a/CHANGELOG.md b/CHANGELOG.md index e0c5d2c01fb..212c459e284 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,17 @@ ## master -## maps-v1.3.0 (2020.02-relvanillashake) +## maps-v1.3.1 (2020.02-release-vanillashake) + +### 🐞 Bug fixes + +- [core] Fix iterators in addRegularDash() ([#16249](https://github.com/mapbox/mapbox-gl-native/pull/16249)) + + Fixes possible crashes when using styles with line patterns. + +- [default] Fix possible crash at RunLoop::wake() ([#16255](https://github.com/mapbox/mapbox-gl-native/pull/16255)) + +## maps-v1.3.0 (2020.02-release-vanillashake) ### 🐞 Bug fixes diff --git a/platform/default/src/mbgl/util/run_loop.cpp b/platform/default/src/mbgl/util/run_loop.cpp index 868ee72114f..6ea999e80b6 100644 --- a/platform/default/src/mbgl/util/run_loop.cpp +++ b/platform/default/src/mbgl/util/run_loop.cpp @@ -130,7 +130,7 @@ LOOP_HANDLE RunLoop::getLoopHandle() { } void RunLoop::wake() { - impl->async->send(); + if (impl->async) impl->async->send(); } void RunLoop::run() { diff --git a/src/mbgl/geometry/line_atlas.cpp b/src/mbgl/geometry/line_atlas.cpp index 3b6d82c46cf..656cfbd25cd 100644 --- a/src/mbgl/geometry/line_atlas.cpp +++ b/src/mbgl/geometry/line_atlas.cpp @@ -51,15 +51,17 @@ void addRoundDash( const std::vector& ranges, uint32_t yOffset, float stretch, const int n, AlphaImage& image) { const float halfStretch = stretch * 0.5f; + if (ranges.empty()) return; + for (int y = -n; y <= n; y++) { int row = yOffset + n + y; const uint32_t index = image.size.width * row; uint32_t currIndex = 0; DashRange range = ranges[currIndex]; - for (uint32_t x = 0; x < image.size.width; x++) { - if (x / range.right > 1.0f) { - range = ranges[++currIndex]; + for (uint32_t x = 0; x < image.size.width; ++x) { + if (x / range.right > 1.0f && ++currIndex < ranges.size()) { + range = ranges[currIndex]; } float distLeft = fabsf(x - range.left); @@ -84,22 +86,24 @@ void addRegularDash(std::vector& ranges, uint32_t yOffset, AlphaImage // Collapse any zero-length range for (auto it = ranges.begin(); it != ranges.end();) { if (it->isZeroLength) { - ranges.erase(it); + it = ranges.erase(it); } else { ++it; } } - if (ranges.size() >= 2) { + if (ranges.empty()) return; + + if (ranges.size() > 1) { // Collapse neighbouring same-type parts into a single part - for (auto curr = ranges.begin(), next = ranges.begin() + 1; curr != ranges.end() && next != ranges.end();) { + for (auto curr = ranges.begin(), next = ranges.begin() + 1; next != ranges.end();) { if (next->isDash == curr->isDash) { next->left = curr->left; - ranges.erase(curr); + curr = ranges.erase(curr); } else { ++curr; - ++next; } + next = curr + 1; } } @@ -115,8 +119,8 @@ void addRegularDash(std::vector& ranges, uint32_t yOffset, AlphaImage DashRange range = ranges[currIndex]; for (uint32_t x = 0; x < image.size.width; ++x) { - if (x / range.right > 1.0f) { - range = ranges[++currIndex]; + if (x / range.right > 1.0f && ++currIndex < ranges.size()) { + range = ranges[currIndex]; } float distLeft = fabsf(x - range.left);