I don't know why staring at the email to python-checkins made me
see problems with my code that I didn't see before the checkin, but:

When a subtype .mro() fails, we need to reset the type whose __bases__
are being changed, too.  Fix + test.
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 19a0ae4..99eecd3 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -3566,11 +3566,13 @@
     # check here that E's gets restored.
     
     E_mro_before = E.__mro__
+    D_mro_before = D.__mro__
 
     try:
         D.__bases__ = (C2,)
     except RuntimeError:
         vereq(E.__mro__, E_mro_before)
+        vereq(D.__mro__, D_mro_before)
     else:
         raise TestFailed, "exception not propagated"
 
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 949cef5..d83ff8c 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -242,17 +242,12 @@
 	type->tp_base = new_base;
 
 	if (mro_internal(type) < 0) {
-		type->tp_bases = old_bases;
-		type->tp_base = old_base;
-		type->tp_mro = old_mro;
-
-		Py_DECREF(value);
-		Py_DECREF(new_base);
-
-		return -1;
+		goto bail;
 	}
 
 	temp = PyList_New(0);
+	if (!temp)
+		goto bail;
 
 	r = mro_subclasses(type, temp);
 
@@ -267,7 +262,7 @@
 			Py_INCREF(cls->tp_mro);
 		}
 		Py_DECREF(temp);
-		return r;
+		goto bail;
 	}
 
 	Py_DECREF(temp);
@@ -303,6 +298,16 @@
 	Py_DECREF(old_mro);
 
 	return r;
+
+  bail:
+	type->tp_bases = old_bases;
+	type->tp_base = old_base;
+	type->tp_mro = old_mro;
+	
+	Py_DECREF(value);
+	Py_DECREF(new_base);
+	
+	return -1;
 }
 
 static PyObject *