Index: Objects/setobject.c =================================================================== --- Objects/setobject.c (revision 80156) +++ Objects/setobject.c (working copy) @@ -96,10 +96,13 @@ startkey = entry->key; Py_INCREF(startkey); cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp < 0) + if (cmp < 0) { + Py_DECREF(startkey); return NULL; - if (table == so->table && entry->key == startkey) { + } + if (table == so->table && entry->key == startkey && Py_REFCNT(startkey) >= 2) { + /* since refcnt >= 2, this decref cannot trigger any weirdness */ + Py_DECREF(startkey); if (cmp > 0) return entry; } @@ -107,6 +110,7 @@ /* The compare did major nasty stuff to the * set: start over. */ + Py_DECREF(startkey); return set_lookkey(so, key, hash); } } @@ -129,17 +133,21 @@ startkey = entry->key; Py_INCREF(startkey); cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp < 0) + if (cmp < 0) { + Py_DECREF(startkey); return NULL; - if (table == so->table && entry->key == startkey) { - if (cmp > 0) + } + if (table == so->table && entry->key == startkey && Py_REFCNT(startkey) >= 2) { + if (cmp > 0) { + Py_DECREF(startkey); break; + } } else { /* The compare did major nasty stuff to the * set: start over. */ + Py_DECREF(startkey); return set_lookkey(so, key, hash); } }