changeset: 95420:313fd1c819c5 user: Serhiy Storchaka date: Fri Apr 03 20:53:46 2015 +0300 files: Lib/test/test_format.py Objects/bytesobject.c description: Issue #23466: Raised OverflowError if %c argument is out of range. diff -r 60740163085d -r 313fd1c819c5 Lib/test/test_format.py --- a/Lib/test/test_format.py Fri Apr 03 19:42:32 2015 +0300 +++ b/Lib/test/test_format.py Fri Apr 03 20:53:46 2015 +0300 @@ -358,12 +358,12 @@ "not all arguments converted during bytes formatting") test_exc(b'no format', bytearray(b'1'), TypeError, "not all arguments converted during bytes formatting") - test_exc(b"%c", -1, TypeError, - "%c requires an integer in range(256) or a single byte") - test_exc(b"%c", 256, TypeError, - "%c requires an integer in range(256) or a single byte") - test_exc(b"%c", 2**128, TypeError, - "%c requires an integer in range(256) or a single byte") + test_exc(b"%c", -1, OverflowError, + "%c arg not in range(256)") + test_exc(b"%c", 256, OverflowError, + "%c arg not in range(256)") + test_exc(b"%c", 2**128, OverflowError, + "%c arg not in range(256)") test_exc(b"%c", b"Za", TypeError, "%c requires an integer in range(256) or a single byte") test_exc(b"%c", "Y", TypeError, diff -r 60740163085d -r 313fd1c819c5 Objects/bytesobject.c --- a/Objects/bytesobject.c Fri Apr 03 19:42:32 2015 +0300 +++ b/Objects/bytesobject.c Fri Apr 03 20:53:46 2015 +0300 @@ -496,10 +496,15 @@ ival = PyLong_AsLongAndOverflow(iobj, &overflow); Py_DECREF(iobj); } - if (!overflow && 0 <= ival && ival <= 255) { - *p = (char)ival; - return 1; + if (!overflow && ival == -1 && PyErr_Occurred()) + goto onError; + if (overflow || !(0 <= ival && ival <= 255)) { + PyErr_SetString(PyExc_OverflowError, + "%c arg not in range(256)"); + return 0; } + *p = (char)ival; + return 1; } onError: PyErr_SetString(PyExc_TypeError,