From 8a762a0a195fe85f3a35f2279b88423f125990c4 Mon Sep 17 00:00:00 2001 From: artemp Date: Thu, 29 Oct 2015 14:08:51 +0000 Subject: [PATCH] GeoJSON - ensure error_handler doesn't read passed the end of stream re #3154 --- include/mapnik/json/error_handler.hpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/include/mapnik/json/error_handler.hpp b/include/mapnik/json/error_handler.hpp index 90d64af28..78ae5ebb6 100644 --- a/include/mapnik/json/error_handler.hpp +++ b/include/mapnik/json/error_handler.hpp @@ -29,6 +29,7 @@ #pragma GCC diagnostic ignored "-Wsign-conversion" #include #pragma GCC diagnostic pop +#include namespace mapnik { namespace json { @@ -37,14 +38,18 @@ struct error_handler { using result_type = void; void operator() ( - Iterator, Iterator, - Iterator err_pos, boost::spirit::info const& what) const + Iterator, + Iterator end, + Iterator err_pos, + boost::spirit::info const& what) const { std::stringstream s; - auto start = err_pos; - std::advance(err_pos,16); - auto end = err_pos; - s << "Mapnik geojson parsing error:" << what << " expected but got: " << std::string(start, end); + using difference_type = typename std::iterator_traits::difference_type; + auto start_err= err_pos; + std::advance(err_pos, std::min(std::distance(err_pos, end), difference_type(16))); + auto end_err = err_pos; + assert(end_err <= end); + s << "Mapnik GeoJSON parsing error:" << what << " expected but got: " << std::string(start_err, end_err); throw std::runtime_error(s.str()); } };