From cf5c6c8d3188c8e422a0baa1059adc457795b075 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 9 Nov 2004 12:49:20 +0000 Subject: [PATCH] locale_facets.tcc (time_get<>::do_get_weekday, [...]): Absolutely avoid dereferencing end iterators. 2004-11-09 Paolo Carlini * include/bits/locale_facets.tcc (time_get<>::do_get_weekday, time_get<>::do_get_monthname): Absolutely avoid dereferencing end iterators. * include/bits/locale_facets.tcc (time_get<>::_M_extract_name): Minor tweak. From-SVN: r90341 --- libstdc++-v3/ChangeLog | 9 +++++++++ libstdc++-v3/include/bits/locale_facets.tcc | 19 +++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index d8740bd3087..3cace9cc94a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2004-11-09 Paolo Carlini + + * include/bits/locale_facets.tcc (time_get<>::do_get_weekday, + time_get<>::do_get_monthname): Absolutely avoid dereferencing + end iterators. + + * include/bits/locale_facets.tcc (time_get<>::_M_extract_name): + Minor tweak. + 2004-11-08 Benjamin Kosnik Doug Gregor diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 41778bca710..821697807e3 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -2043,8 +2043,7 @@ namespace std for (size_t __i2 = 1; __i2 < __nmatches; ++__i2) __minlen = std::min(__minlen, __traits_type::length(__names[__matches[__i2]])); - ++__pos; - ++__beg; + ++__beg, ++__pos; if (__pos < __minlen && __beg != __end) for (size_t __i3 = 0; __i3 < __nmatches;) { @@ -2061,8 +2060,7 @@ namespace std if (__nmatches == 1) { // Make sure found name is completely extracted. - ++__pos; - ++__beg; + ++__beg, ++__pos; __name = __names[__matches[0]]; const size_t __len = __traits_type::length(__name); while (__pos < __len && __beg != __end && __name[__pos] == *__beg) @@ -2135,7 +2133,7 @@ namespace std // __days array with the same index points to a day, and that // day's abbreviated form. // NB: Also assumes that an abbreviated name is a subset of the name. - if (!__err) + if (!__err && __beg != __end) { size_t __pos = __traits_type::length(__days[__tmpwday]); __tp._M_days(__days); @@ -2150,9 +2148,10 @@ namespace std if (__len != __pos) __err |= ios_base::failbit; } - if (!__err) - __tm->tm_wday = __tmpwday; } + if (!__err) + __tm->tm_wday = __tmpwday; + if (__beg == __end) __err |= ios_base::eofbit; return __beg; @@ -2180,7 +2179,7 @@ namespace std // __months array with the same index points to a month, and that // month's abbreviated form. // NB: Also assumes that an abbreviated name is a subset of the name. - if (!__err) + if (!__err && __beg != __end) { size_t __pos = __traits_type::length(__months[__tmpmon]); __tp._M_months(__months); @@ -2195,9 +2194,9 @@ namespace std if (__len != __pos) __err |= ios_base::failbit; } - if (!__err) - __tm->tm_mon = __tmpmon; } + if (!__err) + __tm->tm_mon = __tmpmon; if (__beg == __end) __err |= ios_base::eofbit;