re PR libstdc++/11352 (crash while internal padding numeric 0)

2004-02-15  David Asher  <david.asher@cavium.com>

	PR libstdc++/11352
	* include/bits/locale_facets.tcc (__pad<>::_S_pad): Don't
	access __olds beyond __oldlen.

From-SVN: r77858
This commit is contained in:
David Asher 2004-02-15 17:19:00 +00:00 committed by Paolo Carlini
parent bf3e828383
commit 230377dc69
2 changed files with 31 additions and 25 deletions

View File

@ -1,3 +1,9 @@
2004-02-15 David Asher <david.asher@cavium.com>
PR libstdc++/11352
* include/bits/locale_facets.tcc (__pad<>::_S_pad): Don't
access __olds beyond __oldlen.
2004-02-14 Paolo Carlini <pcarlini@suse.de> 2004-02-14 Paolo Carlini <pcarlini@suse.de>
* testsuite/27_io/basic_filebuf/overflow/char/9182-2.cc: Make * testsuite/27_io/basic_filebuf/overflow/char/9182-2.cc: Make

View File

@ -2261,14 +2261,14 @@ namespace std
// Who came up with these rules, anyway? Jeeze. // Who came up with these rules, anyway? Jeeze.
const locale& __loc = __io._M_getloc(); const locale& __loc = __io._M_getloc();
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc); const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__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]) const bool __testsign = _Traits::eq(__ctype.widen('-'), __olds[0])
&& (_Traits::eq(__ctype.widen('x'), __olds[1]) || _Traits::eq(__ctype.widen('+'), __olds[0]);
|| _Traits::eq(__ctype.widen('X'), __olds[1])); 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) if (__testhex)
{ {
__news[0] = __olds[0]; __news[0] = __olds[0];
@ -2292,24 +2292,24 @@ namespace std
bool bool
__verify_grouping(const char* __grouping, size_t __grouping_size, __verify_grouping(const char* __grouping, size_t __grouping_size,
const string& __grouping_tmp) const string& __grouping_tmp)
{ {
const size_t __n = __grouping_tmp.size() - 1; const size_t __n = __grouping_tmp.size() - 1;
const size_t __min = std::min(__n, __grouping_size - 1); const size_t __min = std::min(__n, __grouping_size - 1);
size_t __i = __n; size_t __i = __n;
bool __test = true; bool __test = true;
// Parsed number groupings have to match the // Parsed number groupings have to match the
// numpunct::grouping string exactly, starting at the // numpunct::grouping string exactly, starting at the
// right-most point of the parsed sequence of elements ... // right-most point of the parsed sequence of elements ...
for (size_t __j = 0; __j < __min && __test; --__i, ++__j) for (size_t __j = 0; __j < __min && __test; --__i, ++__j)
__test = __grouping_tmp[__i] == __grouping[__j]; __test = __grouping_tmp[__i] == __grouping[__j];
for (; __i && __test; --__i) for (; __i && __test; --__i)
__test = __grouping_tmp[__i] == __grouping[__min]; __test = __grouping_tmp[__i] == __grouping[__min];
// ... but the last parsed grouping can be <= numpunct // ... but the last parsed grouping can be <= numpunct
// grouping. // grouping.
__test &= __grouping_tmp[0] <= __grouping[__min]; __test &= __grouping_tmp[0] <= __grouping[__min];
return __test; return __test;
} }
template<typename _CharT> template<typename _CharT>
_CharT* _CharT*