Skip to content

Commit 967f2a3

Browse files
bpo-41422: Visit the Pickler's and Unpickler's memo in tp_traverse (GH-21664)
Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 99a73c3 commit 967f2a3

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fixed memory leaks of :class:`pickle.Pickler` and :class:`pickle.Unpickler` involving cyclic references via the
2+
internal memo mapping.

Modules/_pickle.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4707,6 +4707,14 @@ Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
47074707
Py_VISIT(self->fast_memo);
47084708
Py_VISIT(self->reducer_override);
47094709
Py_VISIT(self->buffer_callback);
4710+
PyMemoTable *memo = self->memo;
4711+
if (memo && memo->mt_table) {
4712+
Py_ssize_t i = memo->mt_allocated;
4713+
while (--i >= 0) {
4714+
Py_VISIT(memo->mt_table[i].me_key);
4715+
}
4716+
}
4717+
47104718
return 0;
47114719
}
47124720

@@ -7175,6 +7183,13 @@ Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
71757183
Py_VISIT(self->stack);
71767184
Py_VISIT(self->pers_func);
71777185
Py_VISIT(self->buffers);
7186+
PyObject **memo = self->memo;
7187+
if (memo) {
7188+
Py_ssize_t i = self->memo_size;
7189+
while (--i >= 0) {
7190+
Py_VISIT(memo[i]);
7191+
}
7192+
}
71787193
return 0;
71797194
}
71807195

0 commit comments

Comments
 (0)