Skip to content

Commit 8ff7dbd

Browse files
committed
Fix _PyMem_FreeDelayed() calls, need size.
1 parent 6efe562 commit 8ff7dbd

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

Objects/setobject.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -462,11 +462,11 @@ set_lookkey_threadsafe(PySetObject *so, PyObject *key, Py_hash_t hash)
462462
}
463463
#endif
464464

465-
static void free_entries(setentry *entries, bool use_qsbr)
465+
static void free_entries(setentry *entries, size_t size, bool use_qsbr)
466466
{
467467
#ifdef Py_GIL_DISABLED
468468
if (use_qsbr) {
469-
_PyMem_FreeDelayed(entries);
469+
_PyMem_FreeDelayed(entries, size * sizeof(setentry));
470470
return;
471471
}
472472
#endif
@@ -483,6 +483,7 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
483483
{
484484
setentry *oldtable, *newtable, *entry;
485485
Py_ssize_t oldmask = so->mask;
486+
Py_ssize_t oldsize = (size_t)oldmask + 1;
486487
size_t newmask;
487488
int is_oldtable_malloced;
488489
setentry small_copy[PySet_MINSIZE];
@@ -555,7 +556,7 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
555556
FT_ATOMIC_STORE_PTR_RELEASE(so->table, newtable);
556557

557558
if (is_oldtable_malloced)
558-
free_entries(oldtable, SET_IS_SHARED(so));
559+
free_entries(oldtable, oldsize, SET_IS_SHARED(so));
559560
return 0;
560561
}
561562

@@ -647,6 +648,7 @@ set_clear_internal(PyObject *self)
647648
setentry *table = so->table;
648649
Py_ssize_t fill = so->fill;
649650
Py_ssize_t used = so->used;
651+
Py_ssize_t oldsize = (size_t)so->mask + 1;
650652
int table_is_malloced = table != so->smalltable;
651653
setentry small_copy[PySet_MINSIZE];
652654

@@ -685,7 +687,7 @@ set_clear_internal(PyObject *self)
685687
}
686688

687689
if (table_is_malloced)
688-
free_entries(table, SET_IS_SHARED(so));
690+
free_entries(table, oldsize, SET_IS_SHARED(so));
689691
return 0;
690692
}
691693

@@ -732,6 +734,7 @@ set_dealloc(PyObject *self)
732734
PySetObject *so = _PySet_CAST(self);
733735
setentry *entry;
734736
Py_ssize_t used = so->used;
737+
Py_ssize_t oldsize = (size_t)so->mask + 1;
735738

736739
/* bpo-31095: UnTrack is needed before calling any callbacks */
737740
PyObject_GC_UnTrack(so);
@@ -744,7 +747,7 @@ set_dealloc(PyObject *self)
744747
}
745748
}
746749
if (so->table != so->smalltable)
747-
free_entries(so->table, SET_IS_SHARED(so));
750+
free_entries(so->table, oldsize, SET_IS_SHARED(so));
748751
Py_TYPE(so)->tp_free(so);
749752
}
750753

0 commit comments

Comments
 (0)