@@ -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 },
@@ -789,11 +805,16 @@ static PyType_Slot EVPtype_slots[] = {
789
805
};
790
806
791
807
static PyType_Spec EVPtype_spec = {
792
- "_hashlib.HASH" , /*tp_name*/
793
- sizeof (EVPobject ), /*tp_basicsize*/
794
- 0 , /*tp_itemsize*/
795
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE ,
796
- EVPtype_slots
808
+ .name = "_hashlib.HASH" ,
809
+ .basicsize = sizeof (EVPobject ),
810
+ .flags = (
811
+ Py_TPFLAGS_DEFAULT
812
+ | Py_TPFLAGS_BASETYPE
813
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
814
+ | Py_TPFLAGS_IMMUTABLETYPE
815
+ | Py_TPFLAGS_HAVE_GC
816
+ ),
817
+ .slots = EVPtype_slots
797
818
};
798
819
799
820
#ifdef PY_OPENSSL_HAS_SHAKE
@@ -934,18 +955,25 @@ PyDoc_STRVAR(hashxoftype_doc,
934
955
"digest_size -- number of bytes in this hashes output" );
935
956
936
957
static PyType_Slot EVPXOFtype_slots [] = {
958
+ {Py_tp_dealloc , EVP_dealloc },
959
+ {Py_tp_traverse , EVP_traverse },
937
960
{Py_tp_doc , (char * )hashxoftype_doc },
938
961
{Py_tp_methods , EVPXOF_methods },
939
962
{Py_tp_getset , EVPXOF_getseters },
940
963
{0 , 0 },
941
964
};
942
965
943
966
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
967
+ .name = "_hashlib.HASHXOF" ,
968
+ .basicsize = sizeof (EVPobject ),
969
+ .flags = (
970
+ Py_TPFLAGS_DEFAULT
971
+ | Py_TPFLAGS_BASETYPE
972
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
973
+ | Py_TPFLAGS_IMMUTABLETYPE
974
+ | Py_TPFLAGS_HAVE_GC
975
+ ),
976
+ .slots = EVPXOFtype_slots
949
977
};
950
978
951
979
@@ -1659,7 +1687,8 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1659
1687
}
1660
1688
1661
1689
_hashlibstate * state = get_hashlib_state (module );
1662
- self = PyObject_New (HMACobject , state -> HMACtype );
1690
+ assert (state -> HMACtype != NULL );
1691
+ self = (HMACobject * )state -> HMACtype -> tp_alloc (state -> HMACtype , 0 );
1663
1692
if (self == NULL ) {
1664
1693
goto error ;
1665
1694
}
@@ -1764,7 +1793,8 @@ _hashlib_HMAC_copy_impl(HMACobject *self)
1764
1793
return NULL ;
1765
1794
}
1766
1795
1767
- retval = PyObject_New (HMACobject , Py_TYPE (self ));
1796
+ PyTypeObject * type = Py_TYPE (self );
1797
+ retval = (HMACobject * )type -> tp_alloc (type , 0 );
1768
1798
if (retval == NULL ) {
1769
1799
HMAC_CTX_free (ctx );
1770
1800
return NULL ;
@@ -1776,17 +1806,26 @@ _hashlib_HMAC_copy_impl(HMACobject *self)
1776
1806
}
1777
1807
1778
1808
static void
1779
- _hmac_dealloc (HMACobject * self )
1809
+ _hmac_dealloc (PyObject * op )
1780
1810
{
1781
- PyTypeObject * tp = Py_TYPE (self );
1811
+ PyTypeObject * tp = Py_TYPE (op );
1812
+ PyObject_GC_UnTrack (op );
1813
+ HMACobject * self = HMACobject_CAST (op );
1782
1814
if (self -> ctx != NULL ) {
1783
1815
HMAC_CTX_free (self -> ctx );
1784
1816
self -> ctx = NULL ;
1785
1817
}
1786
- PyObject_Free (self );
1818
+ tp -> tp_free (self );
1787
1819
Py_DECREF (tp );
1788
1820
}
1789
1821
1822
+ static int
1823
+ _hmac_traverse (PyObject * op , visitproc visit , void * arg )
1824
+ {
1825
+ Py_VISIT (Py_TYPE (op ));
1826
+ return 0 ;
1827
+ }
1828
+
1790
1829
static PyObject *
1791
1830
_hmac_repr (HMACobject * self )
1792
1831
{
@@ -1954,16 +1993,22 @@ digest_size -- number of bytes in digest() output\n");
1954
1993
static PyType_Slot HMACtype_slots [] = {
1955
1994
{Py_tp_doc , (char * )hmactype_doc },
1956
1995
{Py_tp_repr , (reprfunc )_hmac_repr },
1957
- {Py_tp_dealloc ,(destructor )_hmac_dealloc },
1996
+ {Py_tp_dealloc , _hmac_dealloc },
1997
+ {Py_tp_traverse , _hmac_traverse },
1958
1998
{Py_tp_methods , HMAC_methods },
1959
1999
{Py_tp_getset , HMAC_getset },
1960
2000
{0 , NULL }
1961
2001
};
1962
2002
1963
2003
PyType_Spec HMACtype_spec = {
1964
- "_hashlib.HMAC" , /* name */
1965
- sizeof (HMACobject ), /* basicsize */
1966
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE ,
2004
+ .name = "_hashlib.HMAC" ,
2005
+ .basicsize = sizeof (HMACobject ),
2006
+ .flags = (
2007
+ Py_TPFLAGS_DEFAULT
2008
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
2009
+ | Py_TPFLAGS_IMMUTABLETYPE
2010
+ | Py_TPFLAGS_HAVE_GC
2011
+ ),
1967
2012
.slots = HMACtype_slots ,
1968
2013
};
1969
2014
0 commit comments