@@ -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