Skip to content

Commit

Permalink
Merged revisions 72930 via svnmerge from
Browse files Browse the repository at this point in the history
svn+ssh://[email protected]/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.
........
  • Loading branch information
collinw committed May 26, 2009
1 parent 7d5285e commit 8ca69de
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 9 deletions.
10 changes: 10 additions & 0 deletions Lib/test/pickletester.py
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,16 @@ def test_recursive_list(self):
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
Expand Down
17 changes: 8 additions & 9 deletions Modules/_pickle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 8ca69de

Please sign in to comment.