Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorMaxim Pimenov <m@maps.me>2016-04-19 15:58:23 +0300
committerMaxim Pimenov <m@maps.me>2016-04-19 18:19:43 +0300
commit578fc4d32056282df3e8a99f7a5744d88cb82b18 (patch)
treed3135c16dde7b8ff9f9742ad69fb7f25ab2d3a49 /base
parent93674126239a76c593c01455c259f1fe804dfde9 (diff)
Fixed an out-of-bounds access.
Diffstat (limited to 'base')
-rw-r--r--base/base_tests/string_utils_test.cpp5
-rw-r--r--base/string_utils.cpp4
2 files changed, 8 insertions, 1 deletions
diff --git a/base/base_tests/string_utils_test.cpp b/base/base_tests/string_utils_test.cpp
index 4eccdbd0f1..f1e2dff2cc 100644
--- a/base/base_tests/string_utils_test.cpp
+++ b/base/base_tests/string_utils_test.cpp
@@ -582,6 +582,11 @@ UNIT_TEST(AlmostEqual)
TEST(!AlmostEqual("MKAD, 600 km", "MKAD, 599 km", 2), ());
TEST(!AlmostEqual("MKAD, 45-y kilometre", "MKAD, 46", 2), ());
TEST(!AlmostEqual("ул. Героев Панфиловцев", "ул. Планерная", 2), ());
+
+ string small(10, '\0');
+ string large(1000, '\0');
+ TEST(AlmostEqual(small, large, large.length()), ());
+ TEST(AlmostEqual(large, small, large.length()), ());
}
UNIT_TEST(EditDistance)
diff --git a/base/string_utils.cpp b/base/string_utils.cpp
index af21d91290..5f26059688 100644
--- a/base/string_utils.cpp
+++ b/base/string_utils.cpp
@@ -1,6 +1,7 @@
#include "base/assert.hpp"
#include "base/string_utils.hpp"
+#include "std/algorithm.hpp"
#include "std/cmath.hpp"
#include "std/iomanip.hpp"
#include "std/iterator.hpp"
@@ -310,7 +311,8 @@ bool AlmostEqual(string const & str1, string const & str2, size_t mismatchedCoun
for (size_t i = 0; i <= mismatchedCount; ++i)
{
- mis = mismatch(mis.first, str1End, mis.second);
+ auto const end = mis.first + min(distance(mis.first, str1End), distance(mis.second, str2End));
+ mis = mismatch(mis.first, end, mis.second);
if (mis.first == str1End && mis.second == str2End)
return true;
if (mis.first != str1End)