From 7b3ed5b29fd33ecfdaedc3bb0b8f6c05ded68361 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 23 Jun 2023 03:02:02 +0200 Subject: gh-105927: _ssl GET_SOCKET() uses _PyWeakref_GET_REF() (#106002) --- Modules/_ssl.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 9ce61a6..4254fde 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -383,10 +383,20 @@ typedef enum { #define ERRSTR1(x,y,z) (x ":" y ": " z) #define ERRSTR(x) ERRSTR1("_ssl.c", Py_STRINGIFY(__LINE__), x) -/* Get the socket from a PySSLSocket, if it has one */ +// Get the socket from a PySSLSocket, if it has one. +// Return a borrowed reference. static inline PySocketSockObject* GET_SOCKET(PySSLSocket *obj) { if (obj->Socket) { - return (PySocketSockObject *)PyWeakref_GetObject(obj->Socket); + PyObject *sock = _PyWeakref_GET_REF(obj->Socket); + if (sock != NULL) { + // GET_SOCKET() returns a borrowed reference + Py_DECREF(sock); + } + else { + // dead weak reference + sock = Py_None; + } + return (PySocketSockObject *)sock; // borrowed reference } else { return NULL; -- cgit v0.12