Patch #1673759: add a missing overflow check when formatting floats
with %G.
This commit is contained in:
parent
bc5fbd9f8c
commit
7c3b50db66
|
@ -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")
|
||||||
|
|
|
@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 1?
|
||||||
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.
|
||||||
|
|
||||||
- T_PYSSIZET can now be used in PyMemberDef lists for Py_ssize_t members.
|
- T_PYSSIZET can now be used in PyMemberDef lists for Py_ssize_t members.
|
||||||
|
|
|
@ -4198,7 +4198,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?)");
|
||||||
|
|
|
@ -7294,7 +7294,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?)");
|
||||||
|
|
Loading…
Reference in New Issue