From 578fc4d32056282df3e8a99f7a5744d88cb82b18 Mon Sep 17 00:00:00 2001 From: Maxim Pimenov Date: Tue, 19 Apr 2016 15:58:23 +0300 Subject: [PATCH] Fixed an out-of-bounds access. --- base/base_tests/string_utils_test.cpp | 5 +++++ base/string_utils.cpp | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) 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)