@@ -282,6 +282,8 @@ typedef struct {
282
282
PyMutex mutex ; /* OpenSSL context lock */
283
283
} EVPobject ;
284
284
285
+ #define EVPobject_CAST (op ) ((EVPobject *)(op))
286
+
285
287
typedef struct {
286
288
PyObject_HEAD
287
289
HMAC_CTX * ctx ; /* OpenSSL hmac context */
@@ -290,6 +292,8 @@ typedef struct {
290
292
PyMutex mutex ; /* HMAC context lock */
291
293
} HMACobject ;
292
294
295
+ #define HMACobject_CAST (op ) ((HMACobject *)(op))
296
+
293
297
#include "clinic/_hashopenssl.c.h"
294
298
/*[clinic input]
295
299
module _hashlib
@@ -497,7 +501,9 @@ py_digest_by_digestmod(PyObject *module, PyObject *digestmod, enum Py_hash_type
497
501
static EVPobject *
498
502
newEVPobject (PyTypeObject * type )
499
503
{
500
- EVPobject * retval = (EVPobject * )PyObject_New (EVPobject , type );
504
+ assert (type != NULL );
505
+ assert (type -> tp_alloc != NULL );
506
+ EVPobject * retval = (EVPobject * )type -> tp_alloc (type , 0 );
501
507
if (retval == NULL ) {
502
508
return NULL ;
503
509
}
@@ -536,14 +542,23 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len)
536
542
/* Internal methods for a hash object */
537
543
538
544
static void
539
- EVP_dealloc (EVPobject * self )
545
+ EVP_dealloc (PyObject * op )
540
546
{
541
- PyTypeObject * tp = Py_TYPE (self );
547
+ PyTypeObject * tp = Py_TYPE (op );
548
+ PyObject_GC_UnTrack (op );
549
+ EVPobject * self = EVPobject_CAST (op );
542
550
EVP_MD_CTX_free (self -> ctx );
543
- PyObject_Free (self );
551
+ tp -> tp_free (self );
544
552
Py_DECREF (tp );
545
553
}
546
554
555
+ static int
556
+ EVP_traverse (PyObject * op , visitproc visit , void * arg )
557
+ {
558
+ Py_VISIT (Py_TYPE (op ));
559
+ return 0 ;
560
+ }
561
+
547
562
static int
548
563
locked_EVP_MD_CTX_copy (EVP_MD_CTX * new_ctx_p , EVPobject * self )
549
564
{
@@ -781,6 +796,7 @@ PyDoc_STRVAR(hashtype_doc,
781
796
782
797
static PyType_Slot EVPtype_slots [] = {
783
798
{Py_tp_dealloc , EVP_dealloc },
799
+ {Py_tp_traverse , EVP_traverse },
784
800
{Py_tp_repr , EVP_repr },
785
801
{Py_tp_doc , (char * )hashtype_doc },
786
802
{Py_tp_methods , EVP_methods },
@@ -934,18 +950,25 @@ PyDoc_STRVAR(hashxoftype_doc,
934
950
"digest_size -- number of bytes in this hashes output" );
935
951
936
952
static PyType_Slot EVPXOFtype_slots [] = {
953
+ {Py_tp_dealloc , EVP_dealloc },
954
+ {Py_tp_traverse , EVP_traverse },
937
955
{Py_tp_doc , (char * )hashxoftype_doc },
938
956
{Py_tp_methods , EVPXOF_methods },
939
957
{Py_tp_getset , EVPXOF_getseters },
940
958
{0 , 0 },
941
959
};
942
960
943
961
static PyType_Spec EVPXOFtype_spec = {
944
- "_hashlib.HASHXOF" , /*tp_name*/
945
- sizeof (EVPobject ), /*tp_basicsize*/
946
- 0 , /*tp_itemsize*/
947
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE ,
948
- EVPXOFtype_slots
962
+ .name = "_hashlib.HASHXOF" ,
963
+ .basicsize = sizeof (EVPobject ),
964
+ .flags = (
965
+ Py_TPFLAGS_DEFAULT
966
+ | Py_TPFLAGS_BASETYPE
967
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
968
+ | Py_TPFLAGS_IMMUTABLETYPE
969
+ | Py_TPFLAGS_HAVE_GC
970
+ ),
971
+ .slots = EVPXOFtype_slots
949
972
};
950
973
951
974
@@ -1659,7 +1682,8 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1659
1682
}
1660
1683
1661
1684
_hashlibstate * state = get_hashlib_state (module );
1662
- self = PyObject_New (HMACobject , state -> HMACtype );
1685
+ assert (state -> HMACtype != NULL );
1686
+ self = (HMACobject * )state -> HMACtype -> tp_alloc (state -> HMACtype , 0 );
1663
1687
if (self == NULL ) {
1664
1688
goto error ;
1665
1689
}
@@ -1764,7 +1788,8 @@ _hashlib_HMAC_copy_impl(HMACobject *self)
1764
1788
return NULL ;
1765
1789
}
1766
1790
1767
- retval = PyObject_New (HMACobject , Py_TYPE (self ));
1791
+ PyTypeObject * type = Py_TYPE (self );
1792
+ retval = (HMACobject * )type -> tp_alloc (type , 0 );
1768
1793
if (retval == NULL ) {
1769
1794
HMAC_CTX_free (ctx );
1770
1795
return NULL ;
@@ -1776,17 +1801,26 @@ _hashlib_HMAC_copy_impl(HMACobject *self)
1776
1801
}
1777
1802
1778
1803
static void
1779
- _hmac_dealloc (HMACobject * self )
1804
+ _hmac_dealloc (PyObject * op )
1780
1805
{
1781
- PyTypeObject * tp = Py_TYPE (self );
1806
+ PyTypeObject * tp = Py_TYPE (op );
1807
+ PyObject_GC_UnTrack (op );
1808
+ HMACobject * self = HMACobject_CAST (op );
1782
1809
if (self -> ctx != NULL ) {
1783
1810
HMAC_CTX_free (self -> ctx );
1784
1811
self -> ctx = NULL ;
1785
1812
}
1786
- PyObject_Free (self );
1813
+ tp -> tp_free (self );
1787
1814
Py_DECREF (tp );
1788
1815
}
1789
1816
1817
+ static int
1818
+ _hmac_traverse (PyObject * op , visitproc visit , void * arg )
1819
+ {
1820
+ Py_VISIT (Py_TYPE (op ));
1821
+ return 0 ;
1822
+ }
1823
+
1790
1824
static PyObject *
1791
1825
_hmac_repr (HMACobject * self )
1792
1826
{
@@ -1954,16 +1988,22 @@ digest_size -- number of bytes in digest() output\n");
1954
1988
static PyType_Slot HMACtype_slots [] = {
1955
1989
{Py_tp_doc , (char * )hmactype_doc },
1956
1990
{Py_tp_repr , (reprfunc )_hmac_repr },
1957
- {Py_tp_dealloc ,(destructor )_hmac_dealloc },
1991
+ {Py_tp_dealloc , _hmac_dealloc },
1992
+ {Py_tp_traverse , _hmac_traverse },
1958
1993
{Py_tp_methods , HMAC_methods },
1959
1994
{Py_tp_getset , HMAC_getset },
1960
1995
{0 , NULL }
1961
1996
};
1962
1997
1963
1998
PyType_Spec HMACtype_spec = {
1964
- "_hashlib.HMAC" , /* name */
1965
- sizeof (HMACobject ), /* basicsize */
1966
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE ,
1999
+ .name = "_hashlib.HMAC" ,
2000
+ .basicsize = sizeof (HMACobject ),
2001
+ .flags = (
2002
+ Py_TPFLAGS_DEFAULT
2003
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
2004
+ | Py_TPFLAGS_IMMUTABLETYPE
2005
+ | Py_TPFLAGS_HAVE_GC
2006
+ ),
1967
2007
.slots = HMACtype_slots ,
1968
2008
};
1969
2009
0 commit comments