Merged revisions 67049 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r67049 | amaury.forgeotdarc | 2008-10-30 22:18:34 +0100 (jeu., 30 oct. 2008) | 8 lines

  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)

  A list is not an iterator...

  Will backport to 2.6 and 2.5.
........
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 4c301ad..21deaff 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -876,6 +876,22 @@
         d = self.dumps(x, 2)
         self.assertRaises(RuntimeError, self.loads, d)
 
+    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, []
+
+        for proto in protocols:
+            self.assertRaises(pickle.PickleError, self.dumps, C(), proto)
+            self.assertRaises(pickle.PickleError, self.dumps, D(), proto)
+
 # Test classes for reduce_ex
 
 class REX_one(object):