]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 72930 via svnmerge from
authorCollin Winter <collinw@gmail.com>
Tue, 26 May 2009 16:53:41 +0000 (16:53 +0000)
committerCollin Winter <collinw@gmail.com>
Tue, 26 May 2009 16:53:41 +0000 (16:53 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r72930 | collin.winter | 2009-05-25 21:12:39 -0700 (Mon, 25 May 2009) | 1 line

  Issue 5794: fix cPickle's unpickling of recursive tuples.
........

Lib/test/pickletester.py
Modules/_pickle.c

index 1585586d3dea1faab802ac5e15db948d4657dcb2..58ce3b5cf96c8b1605748e2eb9a206acf6e4987e 100644 (file)
@@ -432,6 +432,16 @@ class AbstractPickleTests(unittest.TestCase):
             self.assertEqual(len(x), 1)
             self.assert_(x is x[0])
 
+    def test_recursive_tuple(self):
+        t = ([],)
+        t[0].append(t)
+        for proto in protocols:
+            s = self.dumps(t, proto)
+            x = self.loads(s)
+            self.assertEqual(len(x), 1)
+            self.assertEqual(len(x[0]), 1)
+            self.assert_(x is x[0][0])
+
     def test_recursive_dict(self):
         d = {}
         d[1] = d
index 6f33c25219b3269798f6ff870df1cd79f6e71aef..3ad55b587ff59eb3f9881120082f251ad49d0034 100644 (file)
@@ -3639,25 +3639,24 @@ load_binpersid(UnpicklerObject *self)
 static int
 load_pop(UnpicklerObject *self)
 {
-    int len;
-
-    if ((len = self->stack->length) <= 0)
-        return stack_underflow();
+    int len = self->stack->length;
 
     /* Note that we split the (pickle.py) stack into two stacks,
      * an object stack and a mark stack. We have to be clever and
      * pop the right one. We do this by looking at the top of the
-     * mark stack.
+     * mark stack first, and only signalling a stack underflow if
+     * the object stack is empty and the mark stack doesn't match
+     * our expectations.
      */
-
-    if ((self->num_marks > 0) && (self->marks[self->num_marks - 1] == len))
+    if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
         self->num_marks--;
-    else {
+    } else if (len >= 0) {
         len--;
         Py_DECREF(self->stack->data[len]);
         self->stack->length = len;
+    } else {
+        return stack_underflow();
     }
-
     return 0;
 }