@@ -434,11 +434,11 @@ static PyType_Slot sslerror_type_slots[] = {
434434};
435435
436436static PyType_Spec sslerror_type_spec = {
437- "ssl.SSLError" ,
438- sizeof (PyOSErrorObject ),
439- 0 ,
440- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_IMMUTABLETYPE ,
441- sslerror_type_slots
437+ . name = "ssl.SSLError" ,
438+ . basicsize = sizeof (PyOSErrorObject ),
439+ . flags = ( Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
440+ Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC ) ,
441+ . slots = sslerror_type_slots
442442};
443443
444444static void
@@ -789,7 +789,8 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
789789 SSL_CTX * ctx = sslctx -> ctx ;
790790 _PySSLError err = { 0 };
791791
792- self = PyObject_New (PySSLSocket , get_state_ctx (sslctx )-> PySSLSocket_Type );
792+ self = PyObject_GC_New (PySSLSocket ,
793+ get_state_ctx (sslctx )-> PySSLSocket_Type );
793794 if (self == NULL )
794795 return NULL ;
795796
@@ -896,6 +897,8 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
896897 return NULL ;
897898 }
898899 }
900+
901+ PyObject_GC_Track (self );
899902 return self ;
900903}
901904
@@ -2169,6 +2172,7 @@ PySSL_traverse(PySSLSocket *self, visitproc visit, void *arg)
21692172 Py_VISIT (self -> exc_type );
21702173 Py_VISIT (self -> exc_value );
21712174 Py_VISIT (self -> exc_tb );
2175+ Py_VISIT (Py_TYPE (self ));
21722176 return 0 ;
21732177}
21742178
@@ -2185,13 +2189,15 @@ static void
21852189PySSL_dealloc (PySSLSocket * self )
21862190{
21872191 PyTypeObject * tp = Py_TYPE (self );
2188- if (self -> ssl )
2192+ PyObject_GC_UnTrack (self );
2193+ if (self -> ssl ) {
21892194 SSL_free (self -> ssl );
2195+ }
21902196 Py_XDECREF (self -> Socket );
21912197 Py_XDECREF (self -> ctx );
21922198 Py_XDECREF (self -> server_hostname );
21932199 Py_XDECREF (self -> owner );
2194- PyObject_Free (self );
2200+ PyObject_GC_Del (self );
21952201 Py_DECREF (tp );
21962202}
21972203
@@ -2903,11 +2909,11 @@ static PyType_Slot PySSLSocket_slots[] = {
29032909};
29042910
29052911static PyType_Spec PySSLSocket_spec = {
2906- "_ssl._SSLSocket" ,
2907- sizeof (PySSLSocket ),
2908- 0 ,
2909- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE ,
2910- PySSLSocket_slots ,
2912+ . name = "_ssl._SSLSocket" ,
2913+ . basicsize = sizeof (PySSLSocket ),
2914+ . flags = ( Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE |
2915+ Py_TPFLAGS_HAVE_GC ) ,
2916+ . slots = PySSLSocket_slots ,
29112917};
29122918
29132919/*
@@ -3159,6 +3165,7 @@ context_traverse(PySSLContext *self, visitproc visit, void *arg)
31593165{
31603166 Py_VISIT (self -> set_sni_cb );
31613167 Py_VISIT (self -> msg_cb );
3168+ Py_VISIT (Py_TYPE (self ));
31623169 return 0 ;
31633170}
31643171
@@ -4641,11 +4648,11 @@ static PyType_Slot PySSLContext_slots[] = {
46414648};
46424649
46434650static PyType_Spec PySSLContext_spec = {
4644- "_ssl._SSLContext" ,
4645- sizeof (PySSLContext ),
4646- 0 ,
4647- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE ,
4648- PySSLContext_slots ,
4651+ . name = "_ssl._SSLContext" ,
4652+ . basicsize = sizeof (PySSLContext ),
4653+ . flags = ( Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
4654+ Py_TPFLAGS_IMMUTABLETYPE ) ,
4655+ . slots = PySSLContext_slots ,
46494656};
46504657
46514658
@@ -4689,10 +4696,18 @@ _ssl_MemoryBIO_impl(PyTypeObject *type)
46894696 return (PyObject * ) self ;
46904697}
46914698
4699+ static int
4700+ memory_bio_traverse (PySSLMemoryBIO * self , visitproc visit , void * arg )
4701+ {
4702+ Py_VISIT (Py_TYPE (self ));
4703+ return 0 ;
4704+ }
4705+
46924706static void
46934707memory_bio_dealloc (PySSLMemoryBIO * self )
46944708{
46954709 PyTypeObject * tp = Py_TYPE (self );
4710+ PyObject_GC_UnTrack (self );
46964711 BIO_free (self -> bio );
46974712 Py_TYPE (self )-> tp_free (self );
46984713 Py_DECREF (tp );
@@ -4843,15 +4858,16 @@ static PyType_Slot PySSLMemoryBIO_slots[] = {
48434858 {Py_tp_getset , memory_bio_getsetlist },
48444859 {Py_tp_new , _ssl_MemoryBIO },
48454860 {Py_tp_dealloc , memory_bio_dealloc },
4861+ {Py_tp_traverse , memory_bio_traverse },
48464862 {0 , 0 },
48474863};
48484864
48494865static PyType_Spec PySSLMemoryBIO_spec = {
4850- "_ssl.MemoryBIO" ,
4851- sizeof (PySSLMemoryBIO ),
4852- 0 ,
4853- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE ,
4854- PySSLMemoryBIO_slots ,
4866+ . name = "_ssl.MemoryBIO" ,
4867+ . basicsize = sizeof (PySSLMemoryBIO ),
4868+ . flags = ( Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE |
4869+ Py_TPFLAGS_HAVE_GC ) ,
4870+ . slots = PySSLMemoryBIO_slots ,
48554871};
48564872
48574873/*
@@ -4934,6 +4950,7 @@ static int
49344950PySSLSession_traverse (PySSLSession * self , visitproc visit , void * arg )
49354951{
49364952 Py_VISIT (self -> ctx );
4953+ Py_VISIT (Py_TYPE (self ));
49374954 return 0 ;
49384955}
49394956
@@ -5022,11 +5039,11 @@ static PyType_Slot PySSLSession_slots[] = {
50225039};
50235040
50245041static PyType_Spec PySSLSession_spec = {
5025- "_ssl.SSLSession" ,
5026- sizeof (PySSLSession ),
5027- 0 ,
5028- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE ,
5029- PySSLSession_slots ,
5042+ . name = "_ssl.SSLSession" ,
5043+ . basicsize = sizeof (PySSLSession ),
5044+ . flags = ( Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
5045+ Py_TPFLAGS_IMMUTABLETYPE ) ,
5046+ . slots = PySSLSession_slots ,
50305047};
50315048
50325049
0 commit comments