diff options
author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-10-30 21:29:12 (GMT) |
---|---|---|
committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-10-30 21:29:12 (GMT) |
commit | c353ea795c6850d85e29849e763e83382df4e3e2 (patch) | |
tree | cf78386b748e54b9379f5e1a7e9db99dc49bae19 /Lib | |
parent | 68daeb0f8575bd4acb7c7b0e2d0bfee4c6c961b2 (diff) | |
download | cpython-c353ea795c6850d85e29849e763e83382df4e3e2.zip cpython-c353ea795c6850d85e29849e763e83382df4e3e2.tar.gz cpython-c353ea795c6850d85e29849e763e83382df4e3e2.tar.bz2 |
Issue #4176: Pickle would crash the interpreter when a __reduce__ function
does not return an iterator for the 4th and 5th items.
(sequence-like and mapping-like state)
Backport of r67049
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/pickletester.py | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index e1bc078..bf9bca7 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -849,6 +849,29 @@ class AbstractPickleTests(unittest.TestCase): y = self.loads(s) self.assertEqual(y._reduce_called, 1) + def test_reduce_bad_iterator(self): + # Issue4176: crash when 4th and 5th items of __reduce__() + # are not iterators + class C(object): + def __reduce__(self): + # 4th item is not an iterator + return list, (), None, [], None + class D(object): + def __reduce__(self): + # 5th item is not an iterator + return dict, (), None, None, [] + + # Protocol 0 is less strict and also accept iterables. + for proto in 0, 1, 2: + try: + self.dumps(C(), proto) + except (AttributeError, pickle.PickleError, cPickle.PickleError): + pass + try: + self.dumps(D(), proto) + except (AttributeError, pickle.PickleError, cPickle.PickleError): + pass + # Test classes for reduce_ex class REX_one(object): |