Skip to content

Commit ea47a8a

Browse files
miss-islingtonErlend Egeberg Aasland
and
Erlend Egeberg Aasland
authored
bpo-42972: Fully implement GC protocol for ssl heap types (GH-26370) (GH-26399)
(cherry picked from commit dcb8786) Co-authored-by: Erlend Egeberg Aasland <erlend.aasland@innova.no>
1 parent 0bf0500 commit ea47a8a

File tree

1 file changed

+45
-28
lines changed

1 file changed

+45
-28
lines changed

Modules/_ssl.c

+45-28
Original file line numberDiff line numberDiff line change
@@ -434,11 +434,11 @@ static PyType_Slot sslerror_type_slots[] = {
434434
};
435435

436436
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
442442
};
443443

444444
static 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
21852189
PySSL_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

29052911
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,
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

46434650
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,
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+
46924706
static void
46934707
memory_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

48494865
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,
48554871
};
48564872

48574873
/*
@@ -4934,6 +4950,7 @@ static int
49344950
PySSLSession_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

50245041
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,
50305047
};
50315048

50325049

0 commit comments

Comments
 (0)