From cd6b86c3ebd69c4b638bfef8d09a73f58e2d971e Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Sun, 27 Nov 2011 00:00:48 +0000 Subject: [PATCH] Better Bounds Checking in RideFile::intervalBegin() Return value when out of bounds had a fencepost error. Annoyingly it is exactly the same fencepost error that was fixed in a line of code 10 lines lower in the source. This fixes rare issues with rides where intervals start at the end of the ride file. This can happen with rides that have been split. --- src/RideFile.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/RideFile.cpp b/src/RideFile.cpp index ee2f95e62..9a07d7ac2 100644 --- a/src/RideFile.cpp +++ b/src/RideFile.cpp @@ -119,8 +119,11 @@ RideFile::intervalBegin(const RideFileInterval &interval) const QVector::const_iterator i = std::lower_bound( dataPoints_.begin(), dataPoints_.end(), &p, ComparePointSecs()); if (i == dataPoints_.end()) - return dataPoints_.size(); - return i - dataPoints_.begin(); + return dataPoints_.size()-1; + int offset = i - dataPoints_.begin(); + if (offset > dataPoints_.size()) return dataPoints_.size()-1; + else if (offset <0) return 0; + else return offset; } double @@ -162,7 +165,7 @@ RideFile::distanceIndex(double km) const QVector::const_iterator i = std::lower_bound( dataPoints_.begin(), dataPoints_.end(), &p, ComparePointKm()); if (i == dataPoints_.end()) - return dataPoints_.size(); + return dataPoints_.size()-1; return i - dataPoints_.begin(); }