New version from Jim Fulton to fix a problem that Eric Raymond ran
into.  Jim writes:

The core dump was due to a C decrement operation
in a macro invocation in load_pop.  (BAD)

I fixed this by moving the decrement outside
the macro call.

I added a comment to load_pop and load_mark
to document the fact that cPickle separates the
unpickling stack into two separate stacks, one for
objects and one for marks.

I also moved some increments out of some macro
calls (PyTuple_SET_ITEM and PyList_SET_ITEM).
This wasn't necessary, but made me feel better. :)

I tested these changes in *my* cPickle, which
doesn't have the new Unicode stuff.
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index 73cb6ba..6eeb0a4 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -249,8 +249,8 @@
 
     l=self->length-start;
     UNLESS (r=PyTuple_New(l)) return NULL;
-    for (i=start, j=0 ; j < l; )
-        PyTuple_SET_ITEM(r,j++,self->data[i++]);
+    for (i=start, j=0 ; j < l; i++, j++)
+        PyTuple_SET_ITEM(r, j, self->data[i]);
 
     self->length=start;
     return r;
@@ -263,8 +263,8 @@
 
     l=self->length-start;
     UNLESS (r=PyList_New(l)) return NULL;
-    for (i=start, j=0 ; j < l; )
-        PyList_SET_ITEM(r,j++,self->data[i++]);
+    for (i=start, j=0 ; j < l; i++, j++)
+        PyList_SET_ITEM(r, j, self->data[i]);
 
     self->length=start;
     return r;
@@ -3104,11 +3104,20 @@
 
     UNLESS ((len=self->stack->length) > 0) return stackUnderflow();
 
+    /* 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.
+    */
+
     if ((self->num_marks > 0) && 
         (self->marks[self->num_marks - 1] == len))
         self->num_marks--;
-    else 
-        Py_DECREF(self->stack->data[--(self->stack->length)]);
+    else { 
+        len--;
+        Py_DECREF(self->stack->data[len]);
+	self->stack->length=len;
+    }
 
     return 0;
 }
@@ -3434,6 +3443,11 @@
 load_mark(Unpicklerobject *self) {
     int s;
 
+    /* Note that we split the (pickle.py) stack into two stacks, an
+       object stack and a mark stack. Here we push a mark onto the
+       mark stack.  
+    */
+
     if ((self->num_marks + 1) >= self->marks_size) {
         s=self->marks_size+20;
         if (s <= self->num_marks) s=self->num_marks + 1;