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:
parent
bf3e828383
commit
230377dc69
@ -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
|
||||||
|
@ -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*
|
||||||
|
Loading…
Reference in New Issue
Block a user