@@ -434,11 +434,11 @@ static PyType_Slot sslerror_type_slots[] = {
434
434
};
435
435
436
436
static 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
442
442
};
443
443
444
444
static void
@@ -789,7 +789,8 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
789
789
SSL_CTX * ctx = sslctx -> ctx ;
790
790
_PySSLError err = { 0 };
791
791
792
- self = PyObject_New (PySSLSocket , get_state_ctx (sslctx )-> PySSLSocket_Type );
792
+ self = PyObject_GC_New (PySSLSocket ,
793
+ get_state_ctx (sslctx )-> PySSLSocket_Type );
793
794
if (self == NULL )
794
795
return NULL ;
795
796
@@ -896,6 +897,8 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
896
897
return NULL ;
897
898
}
898
899
}
900
+
901
+ PyObject_GC_Track (self );
899
902
return self ;
900
903
}
901
904
@@ -2169,6 +2172,7 @@ PySSL_traverse(PySSLSocket *self, visitproc visit, void *arg)
2169
2172
Py_VISIT (self -> exc_type );
2170
2173
Py_VISIT (self -> exc_value );
2171
2174
Py_VISIT (self -> exc_tb );
2175
+ Py_VISIT (Py_TYPE (self ));
2172
2176
return 0 ;
2173
2177
}
2174
2178
@@ -2185,13 +2189,15 @@ static void
2185
2189
PySSL_dealloc (PySSLSocket * self )
2186
2190
{
2187
2191
PyTypeObject * tp = Py_TYPE (self );
2188
- if (self -> ssl )
2192
+ PyObject_GC_UnTrack (self );
2193
+ if (self -> ssl ) {
2189
2194
SSL_free (self -> ssl );
2195
+ }
2190
2196
Py_XDECREF (self -> Socket );
2191
2197
Py_XDECREF (self -> ctx );
2192
2198
Py_XDECREF (self -> server_hostname );
2193
2199
Py_XDECREF (self -> owner );
2194
- PyObject_Free (self );
2200
+ PyObject_GC_Del (self );
2195
2201
Py_DECREF (tp );
2196
2202
}
2197
2203
@@ -2903,11 +2909,11 @@ static PyType_Slot PySSLSocket_slots[] = {
2903
2909
};
2904
2910
2905
2911
static 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 ,
2911
2917
};
2912
2918
2913
2919
/*
@@ -3159,6 +3165,7 @@ context_traverse(PySSLContext *self, visitproc visit, void *arg)
3159
3165
{
3160
3166
Py_VISIT (self -> set_sni_cb );
3161
3167
Py_VISIT (self -> msg_cb );
3168
+ Py_VISIT (Py_TYPE (self ));
3162
3169
return 0 ;
3163
3170
}
3164
3171
@@ -4641,11 +4648,11 @@ static PyType_Slot PySSLContext_slots[] = {
4641
4648
};
4642
4649
4643
4650
static 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 ,
4649
4656
};
4650
4657
4651
4658
@@ -4689,10 +4696,18 @@ _ssl_MemoryBIO_impl(PyTypeObject *type)
4689
4696
return (PyObject * ) self ;
4690
4697
}
4691
4698
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
+
4692
4706
static void
4693
4707
memory_bio_dealloc (PySSLMemoryBIO * self )
4694
4708
{
4695
4709
PyTypeObject * tp = Py_TYPE (self );
4710
+ PyObject_GC_UnTrack (self );
4696
4711
BIO_free (self -> bio );
4697
4712
Py_TYPE (self )-> tp_free (self );
4698
4713
Py_DECREF (tp );
@@ -4843,15 +4858,16 @@ static PyType_Slot PySSLMemoryBIO_slots[] = {
4843
4858
{Py_tp_getset , memory_bio_getsetlist },
4844
4859
{Py_tp_new , _ssl_MemoryBIO },
4845
4860
{Py_tp_dealloc , memory_bio_dealloc },
4861
+ {Py_tp_traverse , memory_bio_traverse },
4846
4862
{0 , 0 },
4847
4863
};
4848
4864
4849
4865
static 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 ,
4855
4871
};
4856
4872
4857
4873
/*
@@ -4934,6 +4950,7 @@ static int
4934
4950
PySSLSession_traverse (PySSLSession * self , visitproc visit , void * arg )
4935
4951
{
4936
4952
Py_VISIT (self -> ctx );
4953
+ Py_VISIT (Py_TYPE (self ));
4937
4954
return 0 ;
4938
4955
}
4939
4956
@@ -5022,11 +5039,11 @@ static PyType_Slot PySSLSession_slots[] = {
5022
5039
};
5023
5040
5024
5041
static 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 ,
5030
5047
};
5031
5048
5032
5049
0 commit comments