From 2251347131d304da68d5d8c237e69d1c12cb1e2a Mon Sep 17 00:00:00 2001 From: kale-smoothie <34165060+kale-smoothie@users.noreply.github.com> Date: Tue, 28 Jul 2020 19:28:01 +0100 Subject: [PATCH 1/3] Visit the Unpickler's memo in Unpickler_traverse. --- Modules/_pickle.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index bddd8f46f0e40f..da9feceb7ecfaa 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -7182,6 +7182,13 @@ Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg) Py_VISIT(self->stack); Py_VISIT(self->pers_func); Py_VISIT(self->buffers); + PyObject** memo = self->memo; + if (memo) { + Py_ssize_t i = self->memo_size; + while (--i >= 0) { + Py_VISIT(memo[i]); + } + } return 0; } From 29fb997ac5d40c31e56adff4f5defa781a6a2e4a Mon Sep 17 00:00:00 2001 From: kale-smoothie <34165060+kale-smoothie@users.noreply.github.com> Date: Tue, 28 Jul 2020 20:50:07 +0100 Subject: [PATCH 2/3] Add news item for bpo-41422. --- .../next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst diff --git a/Misc/NEWS.d/next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst b/Misc/NEWS.d/next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst new file mode 100644 index 00000000000000..0f12ea24a1e4fc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst @@ -0,0 +1,2 @@ +Fixed memory leaks of pickle.Unpickler involving cyclic references via the +internal memo mapping. From 3af4e7b06f19413c0aca8889944958ab3364c74a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 27 Nov 2023 13:06:31 +0200 Subject: [PATCH 3/3] Fix also Pickler. --- .../next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst | 2 +- Modules/_pickle.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst b/Misc/NEWS.d/next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst index 0f12ea24a1e4fc..8bde68f8f2afc8 100644 --- a/Misc/NEWS.d/next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst +++ b/Misc/NEWS.d/next/Library/2020-07-28-20-48-05.bpo-41422.iMwnMu.rst @@ -1,2 +1,2 @@ -Fixed memory leaks of pickle.Unpickler involving cyclic references via the +Fixed memory leaks of :class:`pickle.Pickler` and :class:`pickle.Unpickler` involving cyclic references via the internal memo mapping. diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 7f486e0dfd7a53..227e5378e42285 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4707,6 +4707,14 @@ Pickler_traverse(PicklerObject *self, visitproc visit, void *arg) Py_VISIT(self->fast_memo); Py_VISIT(self->reducer_override); Py_VISIT(self->buffer_callback); + PyMemoTable *memo = self->memo; + if (memo && memo->mt_table) { + Py_ssize_t i = memo->mt_allocated; + while (--i >= 0) { + Py_VISIT(memo->mt_table[i].me_key); + } + } + return 0; }