From a41158909243b13a9175e24a853e20d404d97c02 Mon Sep 17 00:00:00 2001 From: Moritz Kobitzsch Date: Thu, 29 Sep 2016 11:55:36 +0200 Subject: [PATCH] fix polyline decoding --- CHANGELOG.md | 5 +++++ src/engine/polyline_compressor.cpp | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78db04419..c8b67feaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - The default profile for car now excludes HOV-only routes in navigation by default - Bugfixes - Fixed a bug that could result in endless loops in combination with sliproads + - fixed a bug where polyline decoding on a defective polyline could end up in out-of-bound access on a vector # 5.4.0-rc.4 - Changes from 5.4.0-rc.3 @@ -17,6 +18,10 @@ - Bugfixes - BREAKING: Fixed a bug where some roads could be falsly identified as sliproadsi This change requires reprocessing datasets with osrm-extract and osrm-contract - BREAKING: Fixed a bug that resulted in false names/ref/destination/pronunciation This change requires reprocessing datasets with osrm-extract and osrm-contract + - `restrictions` is now used for namespaced restrictions and restriction exceptions (e.g. `restriction:motorcar=` as well as `except=motorcar`) + - replaced lhs/rhs profiles by using test defined profiles + - Trip Plugin + - changed internal behaviour to prefer the smallest lexicographic result over the largest one # 5.4.0 - Changes from 5.3.0 diff --git a/src/engine/polyline_compressor.cpp b/src/engine/polyline_compressor.cpp index 1dc9b7045..11954b5d7 100644 --- a/src/engine/polyline_compressor.cpp +++ b/src/engine/polyline_compressor.cpp @@ -100,7 +100,7 @@ std::vector decodePolyline(const std::string &geometry_string) b = geometry_string.at(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; - } while (b >= 0x20); + } while (b >= 0x20 && index < len); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lat += dlat; @@ -111,7 +111,7 @@ std::vector decodePolyline(const std::string &geometry_string) b = geometry_string.at(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; - } while (b >= 0x20); + } while (b >= 0x20 && index < len); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng;