Issue 5794: fix cPickle's unpickling of recursive tuples.
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index fbb1888..486e86f 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -4086,25 +4086,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;
}