Skip to content

Commit

Permalink
GH-89988: Fix memory leak in pickle.Pickler dispatch_table lookup (GH…
Browse files Browse the repository at this point in the history
…-94298)

(cherry picked from commit 01ef1f9)

Co-authored-by: Kumar Aditya <[email protected]>
  • Loading branch information
miss-islington and kumaraditya303 authored Jul 14, 2022
1 parent 29fc20c commit 91f7914
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
23 changes: 23 additions & 0 deletions Lib/test/test_pickle.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix memory leak in :class:`pickle.Pickler` when looking up :attr:`dispatch_table`. Patch by Kumar Aditya.
4 changes: 3 additions & 1 deletion Modules/_pickle.c
Original file line number Diff line number Diff line change
Expand Up @@ -4773,7 +4773,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;
Expand Down

0 comments on commit 91f7914

Please sign in to comment.