Kaydet (Commit) 57bef68b authored tarafından Collin Winter's avatar Collin Winter

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

üst 944f684c
......@@ -463,6 +463,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
......
......@@ -65,6 +65,11 @@ class cPickleFastPicklerTests(AbstractPickleTests):
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,
......
......@@ -4086,25 +4086,24 @@ load_binpersid(Unpicklerobject *self)
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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment