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): ...@@ -463,6 +463,16 @@ class AbstractPickleTests(unittest.TestCase):
self.assertEqual(len(x), 1) self.assertEqual(len(x), 1)
self.assert_(x is x[0]) 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): def test_recursive_dict(self):
d = {} d = {}
d[1] = d d[1] = d
......
...@@ -65,6 +65,11 @@ class cPickleFastPicklerTests(AbstractPickleTests): ...@@ -65,6 +65,11 @@ class cPickleFastPicklerTests(AbstractPickleTests):
AbstractPickleTests.test_recursive_list, AbstractPickleTests.test_recursive_list,
self) self)
def test_recursive_tuple(self):
self.assertRaises(ValueError,
AbstractPickleTests.test_recursive_tuple,
self)
def test_recursive_inst(self): def test_recursive_inst(self):
self.assertRaises(ValueError, self.assertRaises(ValueError,
AbstractPickleTests.test_recursive_inst, AbstractPickleTests.test_recursive_inst,
......
...@@ -4086,25 +4086,24 @@ load_binpersid(Unpicklerobject *self) ...@@ -4086,25 +4086,24 @@ load_binpersid(Unpicklerobject *self)
static int static int
load_pop(Unpicklerobject *self) load_pop(Unpicklerobject *self)
{ {
int len; int len = self->stack->length;
if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
/* Note that we split the (pickle.py) stack into two stacks, /* Note that we split the (pickle.py) stack into two stacks,
an object stack and a mark stack. We have to be clever and 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 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--; self->num_marks--;
else { } else if (len >= 0) {
len--; len--;
Py_DECREF(self->stack->data[len]); Py_DECREF(self->stack->data[len]);
self->stack->length=len; self->stack->length = len;
} else {
return stackUnderflow();
} }
return 0; 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