[Python-checkins] r72931 - in python/branches/release26-maint: Lib/test/pickletester.py Lib/test/test_cpickle.py Modules/cPickle.c

collin.winter python-checkins at python.org
Tue May 26 07:37:22 CEST 2009


Author: collin.winter
Date: Tue May 26 07:37:22 2009
New Revision: 72931

Log:
Merged revisions 72930 via svnmerge from 
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.
........


Modified:
   python/branches/release26-maint/   (props changed)
   python/branches/release26-maint/Lib/test/pickletester.py
   python/branches/release26-maint/Lib/test/test_cpickle.py
   python/branches/release26-maint/Modules/cPickle.c

Modified: python/branches/release26-maint/Lib/test/pickletester.py
==============================================================================
--- python/branches/release26-maint/Lib/test/pickletester.py	(original)
+++ python/branches/release26-maint/Lib/test/pickletester.py	Tue May 26 07:37:22 2009
@@ -428,6 +428,16 @@
             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

Modified: python/branches/release26-maint/Lib/test/test_cpickle.py
==============================================================================
--- python/branches/release26-maint/Lib/test/test_cpickle.py	(original)
+++ python/branches/release26-maint/Lib/test/test_cpickle.py	Tue May 26 07:37:22 2009
@@ -64,6 +64,11 @@
                           AbstractPickleTests.test_recursive_list,
                           self)
 
+    def test_recursive_tuple(self):
+        self.assertRaises(ValueError,
+                          AbstractPickleTests.test_recursive_tuple,
+                          self)
+
     def test_recursive_inst(self):
         self.assertRaises(ValueError,
                           AbstractPickleTests.test_recursive_inst,

Modified: python/branches/release26-maint/Modules/cPickle.c
==============================================================================
--- python/branches/release26-maint/Modules/cPickle.c	(original)
+++ python/branches/release26-maint/Modules/cPickle.c	Tue May 26 07:37:22 2009
@@ -4016,25 +4016,24 @@
 static int
 load_pop(Unpicklerobject *self)
 {
-	int len;
-
-	if (!( (len=self->stack->length) > 0 ))  return stackUnderflow();
+	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;
+		self->stack->length = len;
+	} else {
+		return stackUnderflow();
 	}
-
 	return 0;
 }
 


More information about the Python-checkins mailing list