summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKumar Aditya <59607654+kumaraditya303@users.noreply.github.com>2022-06-28 07:01:43 (GMT)
committerGitHub <noreply@github.com>2022-06-28 07:01:43 (GMT)
commit01ef1f95dab9c9930ce1a23634a3e5a8331bf3c7 (patch)
tree34e90b943d0c8b0ccb1daa4866177a4d52894273
parente6391e08bff775a3c10707fd2cfce6963e6ae429 (diff)
downloadcpython-01ef1f95dab9c9930ce1a23634a3e5a8331bf3c7.zip
cpython-01ef1f95dab9c9930ce1a23634a3e5a8331bf3c7.tar.gz
cpython-01ef1f95dab9c9930ce1a23634a3e5a8331bf3c7.tar.bz2
GH-89988: Fix memory leak in pickle.Pickler dispatch_table lookup (GH-94298)
-rw-r--r--Lib/test/test_pickle.py23
-rw-r--r--Misc/NEWS.d/next/Library/2022-06-26-10-59-15.gh-issue-89988.K8rnmt.rst1
-rw-r--r--Modules/_pickle.c4
3 files changed, 27 insertions, 1 deletions
diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py
index 057af21..44fdca7 100644
--- a/Lib/test/test_pickle.py
+++ b/Lib/test/test_pickle.py
@@ -155,6 +155,29 @@ class PyIdPersPicklerTests(AbstractIdentityPersistentPicklerTests,
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):
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
diff --git a/Misc/NEWS.d/next/Library/2022-06-26-10-59-15.gh-issue-89988.K8rnmt.rst b/Misc/NEWS.d/next/Library/2022-06-26-10-59-15.gh-issue-89988.K8rnmt.rst
new file mode 100644
index 0000000..811a8d6
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-06-26-10-59-15.gh-issue-89988.K8rnmt.rst
@@ -0,0 +1 @@
+Fix memory leak in :class:`pickle.Pickler` when looking up :attr:`dispatch_table`. Patch by Kumar Aditya.
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index 1c5de30..52704b0 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -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;