bpo-42972: Fully implement GC protocol for ssl heap types (GH-26370) … · python/cpython@ea47a8a

@@ -434,11 +434,11 @@ static PyType_Slot sslerror_type_slots[] = {

434434

};

435435436436

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

};

443443444444

static void

@@ -789,7 +789,8 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,

789789

SSL_CTX *ctx = sslctx->ctx;

790790

_PySSLError err = { 0 };

791791792-

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

};

2904291029052911

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

};

2912291829132919

/*

@@ -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

};

4642464946434650

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

};

4650465746514658

@@ -4689,10 +4696,18 @@ _ssl_MemoryBIO_impl(PyTypeObject *type)

46894696

return (PyObject *) self;

46904697

}

469146984699+

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

};

4848486448494865

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

};

4856487248574873

/*

@@ -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

};

5023504050245041

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

};

5031504850325049