Issue #16602: When a weakref's target was part of a long deallocation chain, the object could remain reachable through its weakref even though its refcount had dropped to zero.

Thanks to Eugene Toder for diagnosing and reporting the issue.
This commit is contained in:
Antoine Pitrou 2012-12-08 21:15:26 +01:00
parent 09974b4e9e
commit 62a0d6ea40
5 changed files with 39 additions and 4 deletions

View file

@ -52,9 +52,8 @@ clear_weakref(PyWeakReference *self)
{
PyObject *callback = self->wr_callback;
if (PyWeakref_GET_OBJECT(self) != Py_None) {
PyWeakReference **list = GET_WEAKREFS_LISTPTR(
PyWeakref_GET_OBJECT(self));
if (self->wr_object != Py_None) {
PyWeakReference **list = GET_WEAKREFS_LISTPTR(self->wr_object);
if (*list == self)
/* If 'self' is the end of the list (and thus self->wr_next == NULL)