diff options
author | Brett Cannon <bcannon@gmail.com> | 2007-09-10 21:38:27 (GMT) |
---|---|---|
committer | Brett Cannon <bcannon@gmail.com> | 2007-09-10 21:38:27 (GMT) |
commit | a0c05512ec071b98e8170c8cfe845bee6fc934da (patch) | |
tree | 83da314bd97dd8153e1ffd85f933c24087fae956 | |
parent | f3d280e62acfa2d597dff13105f7fec4a5eeb8e6 (diff) | |
download | cpython-a0c05512ec071b98e8170c8cfe845bee6fc934da.zip cpython-a0c05512ec071b98e8170c8cfe845bee6fc934da.tar.gz cpython-a0c05512ec071b98e8170c8cfe845bee6fc934da.tar.bz2 |
Fix a possible segfault from recursing too deep to get the repr of a list.
Closes issue #1096.
-rw-r--r-- | Lib/test/list_tests.py | 5 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Objects/listobject.c | 3 |
3 files changed, 11 insertions, 0 deletions
diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py index 1c799d7..a0011a4 100644 --- a/Lib/test/list_tests.py +++ b/Lib/test/list_tests.py @@ -46,6 +46,11 @@ class CommonTest(seq_tests.CommonTest): self.assertEqual(str(a2), "[0, 1, 2, [...], 3]") self.assertEqual(repr(a2), "[0, 1, 2, [...], 3]") + l0 = [] + for i in xrange(sys.getrecursionlimit() + 100): + l0 = [l0] + self.assertRaises(RuntimeError, repr, l0) + def test_print(self): d = self.type2test(xrange(200)) d.append(d) @@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 1? Core and builtins ----------------- +- Issue #1096: Prevent a segfault from getting the repr of a very deeply nested + list by using the recursion counter. + - Issue #1202533: Fix infinite recursion calls triggered by calls to PyObject_Call() never calling back out to Python code to trigger recursion depth updates/checks. Required the creation of a static RuntimeError diff --git a/Objects/listobject.c b/Objects/listobject.c index c0621dc..92bad8c 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -324,7 +324,10 @@ list_repr(PyListObject *v) so must refetch the list size on each iteration. */ for (i = 0; i < Py_Size(v); ++i) { int status; + if (Py_EnterRecursiveCall(" while getting the repr of a list")) + goto Done; s = PyObject_Repr(v->ob_item[i]); + Py_LeaveRecursiveCall(); if (s == NULL) goto Done; status = PyList_Append(pieces, s); |