Patch #1673759: add a missing overflow check when formatting floats
with %G. (backport from rev. 56298)
This commit is contained in:
parent
fea72f7c10
commit
c5db923994
|
@ -9,6 +9,7 @@ maxsize = MAX_Py_ssize_t
|
|||
# test on unicode strings as well
|
||||
|
||||
overflowok = 1
|
||||
overflowrequired = 0
|
||||
|
||||
def testformat(formatstr, args, output=None):
|
||||
if verbose:
|
||||
|
@ -25,7 +26,12 @@ def testformat(formatstr, args, output=None):
|
|||
if verbose:
|
||||
print 'overflow (this is fine)'
|
||||
else:
|
||||
if output and result != output:
|
||||
if overflowrequired:
|
||||
if verbose:
|
||||
print 'no'
|
||||
print "overflow expected on %s %% %s" % \
|
||||
(repr(formatstr), repr(args))
|
||||
elif output and result != output:
|
||||
if verbose:
|
||||
print 'no'
|
||||
print "%s %% %s == %s != %s" % \
|
||||
|
@ -57,6 +63,14 @@ testboth("%#.*g", (110, -1.e+100/3.))
|
|||
# test some ridiculously large precision, expect overflow
|
||||
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
|
||||
overflowok = 0
|
||||
testboth("%x", 10L, "a")
|
||||
|
|
|
@ -12,6 +12,9 @@ What's New in Python 2.5.2c1?
|
|||
Core and builtins
|
||||
-----------------
|
||||
|
||||
- Patch #1673759: add a missing overflow check when formatting floats
|
||||
with %G.
|
||||
|
||||
- Patch #1733960: Allow T_LONGLONG to accept ints.
|
||||
|
||||
- Prevent expandtabs() on string and unicode objects from causing a segfault
|
||||
|
|
|
@ -4188,7 +4188,8 @@ formatfloat(char *buf, size_t buflen, int flags,
|
|||
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)) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"formatted float is too long (precision too large?)");
|
||||
|
|
|
@ -7290,7 +7290,8 @@ formatfloat(Py_UNICODE *buf,
|
|||
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)) {
|
||||
PyErr_SetString(PyExc_OverflowError,
|
||||
"formatted float is too long (precision too large?)");
|
||||
|
|
Loading…
Reference in New Issue