From 5073d50905684dc9069c9e047ed00335450bfe47 Mon Sep 17 00:00:00 2001 From: Tim Shen Date: Fri, 16 Aug 2013 09:06:31 +0000 Subject: [PATCH] regex.h (regex_traits<>::transform_primary): Avoid past-the-end dereferences. 2013-08-16 Tim Shen * include/bits/regex.h (regex_traits<>::transform_primary): Avoid past-the-end dereferences. From-SVN: r201783 --- libstdc++-v3/ChangeLog | 5 +++++ libstdc++-v3/include/bits/regex.h | 21 +++++++-------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 8fea147..0c1cb43 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2013-08-16 Tim Shen + + * include/bits/regex.h (regex_traits<>::transform_primary): + Avoid past-the-end dereferences. + 2013-08-14 Paolo Carlini PR libstdc++/58163 diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index 2776749..8fa979f 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -220,19 +220,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION string_type transform_primary(_Fwd_iter __first, _Fwd_iter __last) const { - __try - { - typedef std::ctype __ctype_type; - const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale)); - std::vector __v(__first, __last); - // FIXME : this is not entirely correct - __fctyp.tolower(&*__v.begin(), &*__v.end()); - return this->transform(&*__v.begin(), &*__v.end()); - } - __catch (std::bad_cast) - { - } - return string_type(); + typedef std::ctype __ctype_type; + const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale)); + std::vector __s(__first, __last); + // FIXME : this is not entirely correct + __fctyp.tolower(__s.data(), __s.data() + __s.size()); + return this->transform(__s.data(), __s.data() + __s.size()); } /** @@ -572,7 +565,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION std::string __s(__last - __first, '?'); __fctyp.narrow(__first, __last, '?', &__s[0]); - __cctyp.tolower(&*__s.begin(), &*__s.end()); + __cctyp.tolower(&*__s.begin(), &*__s.begin() + __s.size()); for (_ClassnameEntry* __it = __classnames; __it < *(&__classnames + 1); ++__it) -- 2.7.4