Patch #1673759: add a missing overflow check when formatting floats

with %G.
 (backport from rev. 56298)
This commit is contained in:
Georg Brandl 2007-07-12 08:38:04 +00:00
parent fea72f7c10
commit c5db923994
4 changed files with 24 additions and 5 deletions

View File

@ -9,6 +9,7 @@ maxsize = MAX_Py_ssize_t
# test on unicode strings as well # test on unicode strings as well
overflowok = 1 overflowok = 1
overflowrequired = 0
def testformat(formatstr, args, output=None): def testformat(formatstr, args, output=None):
if verbose: if verbose:
@ -25,11 +26,16 @@ def testformat(formatstr, args, output=None):
if verbose: if verbose:
print 'overflow (this is fine)' print 'overflow (this is fine)'
else: else:
if output and result != output: if overflowrequired:
if verbose: if verbose:
print 'no' print 'no'
print "%s %% %s == %s != %s" %\ print "overflow expected on %s %% %s" % \
(repr(formatstr), repr(args), repr(result), repr(output)) (repr(formatstr), repr(args))
elif output and result != output:
if verbose:
print 'no'
print "%s %% %s == %s != %s" % \
(repr(formatstr), repr(args), repr(result), repr(output))
else: else:
if verbose: if verbose:
print 'yes' print 'yes'
@ -57,6 +63,14 @@ testboth("%#.*g", (110, -1.e+100/3.))
# test some ridiculously large precision, expect overflow # test some ridiculously large precision, expect overflow
testboth('%12.*f', (123456, 1.0)) testboth('%12.*f', (123456, 1.0))
# check for internal overflow validation on length of precision
overflowrequired = 1
testboth("%#.*g", (110, -1.e+100/3.))
testboth("%#.*G", (110, -1.e+100/3.))
testboth("%#.*f", (110, -1.e+100/3.))
testboth("%#.*F", (110, -1.e+100/3.))
overflowrequired = 0
# Formatting of long integers. Overflow is not ok # Formatting of long integers. Overflow is not ok
overflowok = 0 overflowok = 0
testboth("%x", 10L, "a") testboth("%x", 10L, "a")

View File

@ -12,6 +12,9 @@ What's New in Python 2.5.2c1?
Core and builtins Core and builtins
----------------- -----------------
- Patch #1673759: add a missing overflow check when formatting floats
with %G.
- Patch #1733960: Allow T_LONGLONG to accept ints. - Patch #1733960: Allow T_LONGLONG to accept ints.
- Prevent expandtabs() on string and unicode objects from causing a segfault - Prevent expandtabs() on string and unicode objects from causing a segfault

View File

@ -4188,7 +4188,8 @@ formatfloat(char *buf, size_t buflen, int flags,
always given), therefore increase the length by one. always given), therefore increase the length by one.
*/ */
if ((type == 'g' && buflen <= (size_t)10 + (size_t)prec) || if (((type == 'g' || type == 'G') &&
buflen <= (size_t)10 + (size_t)prec) ||
(type == 'f' && buflen <= (size_t)53 + (size_t)prec)) { (type == 'f' && buflen <= (size_t)53 + (size_t)prec)) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"formatted float is too long (precision too large?)"); "formatted float is too long (precision too large?)");

View File

@ -7290,7 +7290,8 @@ formatfloat(Py_UNICODE *buf,
always given), therefore increase the length by one. always given), therefore increase the length by one.
*/ */
if ((type == 'g' && buflen <= (size_t)10 + (size_t)prec) || if (((type == 'g' || type == 'G') &&
buflen <= (size_t)10 + (size_t)prec) ||
(type == 'f' && buflen <= (size_t)53 + (size_t)prec)) { (type == 'f' && buflen <= (size_t)53 + (size_t)prec)) {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,
"formatted float is too long (precision too large?)"); "formatted float is too long (precision too large?)");