8000 [3.11] bpo-41422: Visit the Pickler's and Unpickler's memo in tp_trav… · python/cpython@054d18e · GitHub
[go: up one dir, main page]

Skip to content

Commit 054d18e

Browse files
[3.11] bpo-41422: Visit the Pickler's and Unpickler's memo in tp_traverse (GH-21664) (GH-112465)
(cherry picked from commit 967f2a3) Co-authored-by: kale-smoothie <34165060+kale-smoothie@users.noreply.github.com>
1 parent 581b244 commit 054d18e

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-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: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4691,6 +4691,13 @@ Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
46914691
Py_VISIT(self->fast_memo);
46924692
Py_VISIT(self->reducer_override);
46934693
Py_VISIT(self->buffer_callback);
4694+
PyMemoTable *memo = self->memo;
4695+
if (memo && memo->mt_table) {
4696+
Py_ssize_t i = memo->mt_allocated;
4697+
while (--i >= 0) {
4698+
Py_VISIT(memo->mt_table[i].me_key);
4699+
}
4700+
}
46944701
return 0;
46954702
}
46964703

@@ -7215,6 +7222,13 @@ Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
72157222
Py_VISIT(self->stack);
72167223
Py_VISIT(self->pers_func);
72177224
Py_VISIT(self->buffers);
7225+
PyObject **memo = self->memo;
7226+
if (memo) {
7227+
Py_ssize_t i = self->memo_size;
7228+
while (--i >= 0) {
7229+
Py_VISIT(memo[i]);
7230+
}
7231+
}
72187232
return 0;
72197233
}
72207234

0 commit comments

Comments
 (0)
0