From cc27f5a21c617db50383a01aa04bcf87b24a6bfa Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 28 Oct 2003 12:23:31 +0000 Subject: [PATCH] locale_facets.tcc (time_get::_M_extract_num): Absolutely avoid dereferencing end iterators. 2003-10-28 Paolo Carlini * include/bits/locale_facets.tcc (time_get::_M_extract_num): Absolutely avoid dereferencing end iterators. (time_get::_M_extract_name): Likewise. * include/bits/locale_facets.tcc (time_get::_M_extract_via_format, case 'e'): Don't try to be smart wrt returning the right __beg in case of parse error, time_get::_M_extract_num must be fixed instead. From-SVN: r73004 --- libstdc++-v3/ChangeLog | 11 ++++++++ libstdc++-v3/include/bits/locale_facets.tcc | 31 +++++++++------------ 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 16269c0420e..e773f32ff48 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2003-10-28 Paolo Carlini + + * include/bits/locale_facets.tcc (time_get::_M_extract_num): + Absolutely avoid dereferencing end iterators. + (time_get::_M_extract_name): Likewise. + + * include/bits/locale_facets.tcc + (time_get::_M_extract_via_format, case 'e'): Don't try to + be smart wrt returning the right __beg in case of parse + error, time_get::_M_extract_num must be fixed instead. + 2003-10-27 Paolo Carlini PR libstdc++/12778 diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 25f684dce57..c890e7026f4 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -1619,11 +1619,9 @@ namespace std if (__ctype.is(ctype_base::space, *__beg)) _M_extract_num(++__beg, __end, __tm->tm_mday, 1, 9, 1, __ctype, __err); - else if (*__beg != __ctype.widen('0')) + else _M_extract_num(__beg, __end, __tm->tm_mday, 10, 31, 2, __ctype, __err); - else - __err |= ios_base::failbit; break; case 'D': // Equivalent to %m/%d/%y.[tm_mon, tm_mday, tm_year] @@ -1763,14 +1761,9 @@ namespace std size_t __i = 0; string __digits; bool __testvalid = true; - char_type __c = *__beg; - while (__beg != __end && __i < __len - && __ctype.is(ctype_base::digit, __c)) - { - __digits += __ctype.narrow(__c, 0); - __c = *(++__beg); - ++__i; - } + for (; __beg != __end && __i < __len + && __ctype.is(ctype_base::digit, *__beg); ++__beg, ++__i) + __digits += __ctype.narrow(*__beg, 0); if (__i == __len) { const int __value = std::atoi(__digits.c_str()); @@ -1802,11 +1795,14 @@ namespace std bool __testvalid = true; const char_type* __name; - char_type __c = *__beg; // Look for initial matches. - for (size_t __i1 = 0; __i1 < __indexlen; ++__i1) - if (__c == __names[__i1][0]) - __matches[__nmatches++] = __i1; + if (__beg != __end) + { + const char_type __c = *__beg; + for (size_t __i1 = 0; __i1 < __indexlen; ++__i1) + if (__c == __names[__i1][0]) + __matches[__nmatches++] = __i1; + } while (__nmatches > 1) { @@ -1815,15 +1811,14 @@ namespace std for (size_t __i2 = 0; __i2 < __nmatches; ++__i2) __minlen = std::min(__minlen, __traits_type::length(__names[__matches[__i2]])); - + ++__beg; if (__pos < __minlen && __beg != __end) { ++__pos; - __c = *(++__beg); for (size_t __i3 = 0; __i3 < __nmatches; ++__i3) { __name = __names[__matches[__i3]]; - if (__name[__pos] != __c) + if (__name[__pos] != *__beg) __matches[__i3] = __matches[--__nmatches]; } }