summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-05-26 21:41:42 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-05-26 21:41:42 (GMT)
commit74c71f5a624cef653c7da470607ca063b749ef75 (patch)
tree9f12198761e274b73716ee6c59be788fd9ecc628
parent954aa943f13f183289392d9888cd83cc67715a68 (diff)
downloadcpython-74c71f5a624cef653c7da470607ca063b749ef75.zip
cpython-74c71f5a624cef653c7da470607ca063b749ef75.tar.gz
cpython-74c71f5a624cef653c7da470607ca063b749ef75.tar.bz2
#2957: marshal recursion limit exceeded when importing a large .pyc file
-rw-r--r--Lib/test/test_marshal.py6
-rw-r--r--Misc/NEWS4
-rw-r--r--Python/marshal.c2
3 files changed, 10 insertions, 2 deletions
diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py
index 83ab852..6e3efe4 100644
--- a/Lib/test/test_marshal.py
+++ b/Lib/test/test_marshal.py
@@ -113,6 +113,12 @@ class CodeTestCase(unittest.TestCase):
new = marshal.loads(marshal.dumps(co))
self.assertEqual(co, new)
+ def test_many_codeobjects(self):
+ # Issue2957: bad recursion count on code objects
+ count = 5000 # more than MAX_MARSHAL_STACK_DEPTH
+ codes = (ExceptionTestCase.test_exceptions.__code__,) * count
+ marshal.loads(marshal.dumps(codes))
+
class ContainerTestCase(unittest.TestCase, HelperMixin):
d = {'astring': 'foo@bar.baz.spam',
'afloat': 7283.43,
diff --git a/Misc/NEWS b/Misc/NEWS
index 343bc01..b4f7fdd 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's new in Python 3.0b1?
Core and Builtins
-----------------
+- Issue #2957: Corrected a ValueError "recursion limit exceeded", when
+ unmarshalling many code objects, which happens when importing a
+ large .pyc file (~1000 functions).
+
- Issue #2963: fix merging oversight that disabled method cache for
all types.
diff --git a/Python/marshal.c b/Python/marshal.c
index f7eb445..b1c8dd6 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -913,8 +913,6 @@ r_object(RFILE *p)
Py_XDECREF(filename);
Py_XDECREF(name);
Py_XDECREF(lnotab);
-
- return v;
}
retval = v;
break;