GH-89988: Fix memory leak in pickle.Pickler dispatch_table lookup (GH-94298)

This commit is contained in:
Kumar Aditya 2022-06-28 12:31:43 +05:30 committed by GitHub
parent e6391e08bf
commit 01ef1f95da
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 1 deletions

View file

@ -154,6 +154,29 @@ def persistent_id(obj):
return obj
check(PersPickler)
@support.cpython_only
def test_custom_pickler_dispatch_table_memleak(self):
# See https://github.com/python/cpython/issues/89988
class Pickler(self.pickler):
def __init__(self, *args, **kwargs):
self.dispatch_table = table
super().__init__(*args, **kwargs)
class DispatchTable:
pass
table = DispatchTable()
pickler = Pickler(io.BytesIO())
self.assertIs(pickler.dispatch_table, table)
table_ref = weakref.ref(table)
self.assertIsNotNone(table_ref())
del pickler
del table
support.gc_collect()
self.assertIsNone(table_ref())
@support.cpython_only
def test_unpickler_reference_cycle(self):
def check(Unpickler):

View file

@ -0,0 +1 @@
Fix memory leak in :class:`pickle.Pickler` when looking up :attr:`dispatch_table`. Patch by Kumar Aditya.

View file

@ -4761,7 +4761,9 @@ _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
{
return -1;
}
if (self->dispatch_table != NULL) {
return 0;
}
if (_PyObject_LookupAttr((PyObject *)self, &_Py_ID(dispatch_table),
&self->dispatch_table) < 0) {
return -1;