From: David Asher Date: Sun, 15 Feb 2004 17:19:00 +0000 (+0000) Subject: re PR libstdc++/11352 (crash while internal padding numeric 0) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=230377dc69fe6bd44dc75780a3f37e09fca2ae2c;p=gcc.git re PR libstdc++/11352 (crash while internal padding numeric 0) 2004-02-15 David Asher PR libstdc++/11352 * include/bits/locale_facets.tcc (__pad<>::_S_pad): Don't access __olds beyond __oldlen. From-SVN: r77858 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 917afa6b0e3..2765ee1c740 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2004-02-15 David Asher + + PR libstdc++/11352 + * include/bits/locale_facets.tcc (__pad<>::_S_pad): Don't + access __olds beyond __oldlen. + 2004-02-14 Paolo Carlini * testsuite/27_io/basic_filebuf/overflow/char/9182-2.cc: Make diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 1b7e8e63ddc..afbd96c70ae 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -2261,14 +2261,14 @@ namespace std // Who came up with these rules, anyway? Jeeze. const locale& __loc = __io._M_getloc(); const ctype<_CharT>& __ctype = use_facet >(__loc); - const _CharT __minus = __ctype.widen('-'); - const _CharT __plus = __ctype.widen('+'); - const bool __testsign = _Traits::eq(__olds[0], __minus) - || _Traits::eq(__olds[0], __plus); - - const bool __testhex = _Traits::eq(__ctype.widen('0'), __olds[0]) - && (_Traits::eq(__ctype.widen('x'), __olds[1]) - || _Traits::eq(__ctype.widen('X'), __olds[1])); + + const bool __testsign = _Traits::eq(__ctype.widen('-'), __olds[0]) + || _Traits::eq(__ctype.widen('+'), __olds[0]); + const bool __testhex = (_Traits::eq(__ctype.widen('0'), __olds[0]) + && __oldlen > 1 + && (_Traits::eq(__ctype.widen('x'), __olds[1]) + || _Traits::eq(__ctype.widen('X'), + __olds[1]))); if (__testhex) { __news[0] = __olds[0]; @@ -2292,24 +2292,24 @@ namespace std bool __verify_grouping(const char* __grouping, size_t __grouping_size, const string& __grouping_tmp) - { - const size_t __n = __grouping_tmp.size() - 1; - const size_t __min = std::min(__n, __grouping_size - 1); - size_t __i = __n; - bool __test = true; - - // Parsed number groupings have to match the - // numpunct::grouping string exactly, starting at the - // right-most point of the parsed sequence of elements ... - for (size_t __j = 0; __j < __min && __test; --__i, ++__j) - __test = __grouping_tmp[__i] == __grouping[__j]; - for (; __i && __test; --__i) - __test = __grouping_tmp[__i] == __grouping[__min]; - // ... but the last parsed grouping can be <= numpunct - // grouping. - __test &= __grouping_tmp[0] <= __grouping[__min]; - return __test; - } + { + const size_t __n = __grouping_tmp.size() - 1; + const size_t __min = std::min(__n, __grouping_size - 1); + size_t __i = __n; + bool __test = true; + + // Parsed number groupings have to match the + // numpunct::grouping string exactly, starting at the + // right-most point of the parsed sequence of elements ... + for (size_t __j = 0; __j < __min && __test; --__i, ++__j) + __test = __grouping_tmp[__i] == __grouping[__j]; + for (; __i && __test; --__i) + __test = __grouping_tmp[__i] == __grouping[__min]; + // ... but the last parsed grouping can be <= numpunct + // grouping. + __test &= __grouping_tmp[0] <= __grouping[__min]; + return __test; + } template _CharT*