@@ -71,13 +71,13 @@ typedef struct {
71
71
static SHA3object *
72
72
newSHA3object (PyTypeObject * type )
73
73
{
74
- SHA3object * newobj ;
75
- newobj = (SHA3object * )PyObject_New (SHA3object , type );
74
+ SHA3object * newobj = PyObject_GC_New (SHA3object , type );
76
75
if (newobj == NULL ) {
77
76
return NULL ;
78
77
}
79
78
HASHLIB_INIT_MUTEX (newobj );
80
79
80
+ PyObject_GC_Track (newobj );
81
81
return newobj ;
82
82
}
83
83
@@ -166,15 +166,32 @@ py_sha3_new_impl(PyTypeObject *type, PyObject *data, int usedforsecurity)
166
166
167
167
/* Internal methods for a hash object */
168
168
169
+ static int
170
+ SHA3_clear (SHA3object * self )
171
+ {
172
+ if (self -> hash_state != NULL ) {
173
+ Hacl_Hash_SHA3_free (self -> hash_state );
174
+ self -> hash_state = NULL ;
175
+ }
176
+ return 0 ;
177
+ }
178
+
169
179
static void
170
180
SHA3_dealloc (SHA3object * self )
171
181
{
172
- Hacl_Hash_SHA3_free (self -> hash_state );
173
182
PyTypeObject * tp = Py_TYPE (self );
174
- PyObject_Free (self );
183
+ PyObject_GC_UnTrack (self );
184
+ (void )SHA3_clear (self );
185
+ tp -> tp_free (self );
175
186
Py_DECREF (tp );
176
187
}
177
188
189
+ static int
190
+ SHA3_traverse (PyObject * self , visitproc visit , void * arg )
191
+ {
192
+ Py_VISIT (Py_TYPE (self ));
193
+ return 0 ;
194
+ }
178
195
179
196
/* External methods for a hash object */
180
197
@@ -335,6 +352,7 @@ static PyObject *
335
352
SHA3_get_capacity_bits (SHA3object * self , void * closure )
336
353
{
337
354
uint32_t rate = Hacl_Hash_SHA3_block_len (self -> hash_state ) * 8 ;
355
+ assert (rate <= 1600 );
338
356
int capacity = 1600 - rate ;
339
357
return PyLong_FromLong (capacity );
340
358
}
@@ -366,12 +384,14 @@ static PyGetSetDef SHA3_getseters[] = {
366
384
367
385
#define SHA3_TYPE_SLOTS (type_slots_obj , type_doc , type_methods , type_getseters ) \
368
386
static PyType_Slot type_slots_obj[] = { \
387
+ {Py_tp_clear, SHA3_clear}, \
369
388
{Py_tp_dealloc, SHA3_dealloc}, \
389
+ {Py_tp_traverse, SHA3_traverse}, \
370
390
{Py_tp_doc, (char*)type_doc}, \
371
391
{Py_tp_methods, type_methods}, \
372
392
{Py_tp_getset, type_getseters}, \
373
393
{Py_tp_new, py_sha3_new}, \
374
- {0,0 } \
394
+ {0, NULL } \
375
395
}
376
396
377
397
// Using _PyType_GetModuleState() on these types is safe since they
@@ -380,7 +400,8 @@ static PyGetSetDef SHA3_getseters[] = {
380
400
static PyType_Spec type_spec_obj = { \
381
401
.name = "_sha3." type_name, \
382
402
.basicsize = sizeof(SHA3object), \
383
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE, \
403
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE \
404
+ | Py_TPFLAGS_HAVE_GC, \
384
405
.slots = type_slots \
385
406
}
386
407
@@ -444,9 +465,7 @@ _SHAKE_digest(SHA3object *self, unsigned long digestlen, int hex)
444
465
result = PyBytes_FromStringAndSize ((const char * )digest ,
445
466
digestlen );
446
467
}
447
- if (digest != NULL ) {
448
- PyMem_Free (digest );
449
- }
468
+ PyMem_Free (digest );
450
469
return result ;
451
470
}
452
471
@@ -563,7 +582,7 @@ _sha3_clear(PyObject *module)
563
582
static void
564
583
_sha3_free (void * module )
565
584
{
566
- _sha3_clear ((PyObject * )module );
585
+ ( void ) _sha3_clear ((PyObject * )module );
567
586
}
568
587
569
588
static int
0 commit comments