From: Victor Stinner Date: Fri, 23 Jun 2023 01:02:02 +0000 (+0200) Subject: gh-105927: _ssl GET_SOCKET() uses _PyWeakref_GET_REF() (#106002) X-Git-Tag: v3.13.0a1~1667 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7b3ed5b29fd33ecfdaedc3bb0b8f6c05ded68361;p=thirdparty%2FPython%2Fcpython.git gh-105927: _ssl GET_SOCKET() uses _PyWeakref_GET_REF() (#106002) --- diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 9ce61a651c2c..4254fde0f519 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;