Skip to content

Commit 4463d2e

Browse files
miss-islingtonkale-smoothieserhiy-storchaka
authored
[3.12] bpo-41422: Visit the Pickler's and Unpickler's memo in tp_traverse (GH-21664) (GH-112464)
(cherry picked from commit 967f2a3) Co-authored-by: kale-smoothie <[email protected]> Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 46047bb commit 4463d2e

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
@@ -4712,6 +4712,14 @@ Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
47124712
Py_VISIT(self->fast_memo);
47134713
Py_VISIT(self->reducer_override);
47144714
Py_VISIT(self->buffer_callback);
4715+
PyMemoTable *memo = self->memo;
4716+
if (memo && memo->mt_table) {
4717+
Py_ssize_t i = memo->mt_allocated;
4718+
while (--i >= 0) {
4719+
Py_VISIT(memo->mt_table[i].me_key);
4720+
}
4721+
}
4722+
47154723
return 0;
47164724
}
47174725

@@ -7181,6 +7189,13 @@ Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
71817189
Py_VISIT(self->stack);
71827190
Py_VISIT(self->pers_func);
71837191
Py_VISIT(self->buffers);
7192+
PyObject **memo = self->memo;
7193+
if (memo) {
7194+
Py_ssize_t i = self->memo_size;
7195+
while (--i >= 0) {
7196+
Py_VISIT(memo[i]);
7197+
}
7198+
}
71847199
return 0;
71857200
}
71867201

0 commit comments

Comments
 (0)