mirror of
https://github.com/python/cpython.git
synced 2025-08-11 12:29:34 +00:00
Issue #13546: Fixed an overflow issue that could crash the intepreter when
calling sys.setrecursionlimit((1<<31)-1). 2.7 only.
This commit is contained in:
parent
a94b578431
commit
4bf21e28df
3 changed files with 19 additions and 2 deletions
|
@ -224,6 +224,18 @@ class SysModuleTest(unittest.TestCase):
|
||||||
self.assertEqual(sys.getrecursionlimit(), 10000)
|
self.assertEqual(sys.getrecursionlimit(), 10000)
|
||||||
sys.setrecursionlimit(oldlimit)
|
sys.setrecursionlimit(oldlimit)
|
||||||
|
|
||||||
|
self.assertRaises(OverflowError, sys.setrecursionlimit, 1 << 31)
|
||||||
|
try:
|
||||||
|
sys.setrecursionlimit((1 << 31) - 5)
|
||||||
|
try:
|
||||||
|
# issue13546: isinstance(e, ValueError) used to fail
|
||||||
|
# when the recursion limit is close to 1<<31
|
||||||
|
raise ValueError()
|
||||||
|
except ValueError, e:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
sys.setrecursionlimit(oldlimit)
|
||||||
|
|
||||||
def test_getwindowsversion(self):
|
def test_getwindowsversion(self):
|
||||||
# Raise SkipTest if sys doesn't have getwindowsversion attribute
|
# Raise SkipTest if sys doesn't have getwindowsversion attribute
|
||||||
test.test_support.get_attribute(sys, "getwindowsversion")
|
test.test_support.get_attribute(sys, "getwindowsversion")
|
||||||
|
|
|
@ -9,6 +9,9 @@ What's New in Python 2.7.3?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #13546: Fixed an overflow issue that could crash the intepreter when
|
||||||
|
calling sys.setrecursionlimit((1<<31)-1).
|
||||||
|
|
||||||
- Issue #13333: The UTF-7 decoder now accepts lone surrogates (the encoder
|
- Issue #13333: The UTF-7 decoder now accepts lone surrogates (the encoder
|
||||||
already accepts them).
|
already accepts them).
|
||||||
|
|
||||||
|
|
|
@ -111,9 +111,11 @@ PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
|
||||||
PyErr_Fetch(&exception, &value, &tb);
|
PyErr_Fetch(&exception, &value, &tb);
|
||||||
/* Temporarily bump the recursion limit, so that in the most
|
/* Temporarily bump the recursion limit, so that in the most
|
||||||
common case PyObject_IsSubclass will not raise a recursion
|
common case PyObject_IsSubclass will not raise a recursion
|
||||||
error we have to ignore anyway. */
|
error we have to ignore anyway. Don't do it when the limit
|
||||||
|
is already insanely high, to avoid overflow */
|
||||||
reclimit = Py_GetRecursionLimit();
|
reclimit = Py_GetRecursionLimit();
|
||||||
Py_SetRecursionLimit(reclimit + 5);
|
if (reclimit < (1 << 30))
|
||||||
|
Py_SetRecursionLimit(reclimit + 5);
|
||||||
res = PyObject_IsSubclass(err, exc);
|
res = PyObject_IsSubclass(err, exc);
|
||||||
Py_SetRecursionLimit(reclimit);
|
Py_SetRecursionLimit(reclimit);
|
||||||
/* This function must not fail, so print the error here */
|
/* This function must not fail, so print the error here */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue