From 4cb409e5e884cf01a60d568a85704d0ea30f7132 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Fri, 28 Feb 2020 19:28:34 +0200 Subject: [PATCH 1/2] [core] Fix iterators in addRegularDash() Fix using of invalid iterators. --- src/mbgl/geometry/line_atlas.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) 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); From 1294481a37a90472bd5ea2ffb9a1b482bda096fb Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Fri, 28 Feb 2020 19:41:14 +0200 Subject: [PATCH 2/2] Add change log entry --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0c5d2c01fb..c8fe97487a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## master +### 🐞 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. + ## maps-v1.3.0 (2020.02-relvanillashake) ### 🐞 Bug fixes