diff options
-rw-r--r-- | Lib/test/test_format.py | 20 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Objects/stringobject.c | 3 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 3 |
4 files changed, 24 insertions, 5 deletions
diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index 61e44f9..c4cfa11 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -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,11 +26,16 @@ 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 "%s %% %s == %s != %s" %\ - (repr(formatstr), repr(args), repr(result), repr(output)) + print "overflow expected on %s %% %s" % \ + (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: if verbose: print 'yes' @@ -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.6 alpha 1? Core and builtins ----------------- +- Patch #1673759: add a missing overflow check when formatting floats + with %G. + - Patch #1733960: Allow T_LONGLONG to accept ints. - T_PYSSIZET can now be used in PyMemberDef lists for Py_ssize_t members. diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 3870343..504b119 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -4198,7 +4198,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?)"); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index ad33b8e..85804f1 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7294,7 +7294,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?)"); |