From 9c565c272554cf80ae4f6bab513df2480713c8cb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 23 Jun 2023 01:26:26 +0200 Subject: [PATCH] gh-105927: _ssl GET_SOCKET() uses _PyWeakref_GET_REF() --- Modules/_ssl.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 9ce61a651c2cbb..4254fde0f5190b 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;