mirror of https://github.com/python/cpython.git
Issue 5794: fix cPickle's unpickling of recursive tuples.
This commit is contained in:
parent
944f684ce6
commit
57bef68bc0
|
@ -463,6 +463,16 @@ def test_recursive_list(self):
|
||||||
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 @@ def test_recursive_list(self):
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue