regex.h (regex_traits<>::transform_primary): Avoid past-the-end dereferences.
authorTim Shen <timshen91@gmail.com>
Fri, 16 Aug 2013 09:06:31 +0000 (09:06 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 16 Aug 2013 09:06:31 +0000 (09:06 +0000)
2013-08-16  Tim Shen  <timshen91@gmail.com>

* include/bits/regex.h (regex_traits<>::transform_primary):
Avoid past-the-end dereferences.

From-SVN: r201783

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/regex.h

index 8fea147..0c1cb43 100644 (file)
@@ -1,3 +1,8 @@
+2013-08-16  Tim Shen  <timshen91@gmail.com>
+
+       * include/bits/regex.h (regex_traits<>::transform_primary):
+       Avoid past-the-end dereferences.
+
 2013-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR libstdc++/58163
index 2776749..8fa979f 100644 (file)
@@ -220,19 +220,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         string_type
         transform_primary(_Fwd_iter __first, _Fwd_iter __last) const
         {
-          __try
-            {
-              typedef std::ctype<char_type> __ctype_type;
-              const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
-              std::vector<char_type> __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<char_type> __ctype_type;
+          const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
+          std::vector<char_type> __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)