diff --git a/Misc/NEWS.d/next/Library/2022-11-03-06-41-49.gh-issue-83004.301VK_.rst b/Misc/NEWS.d/next/Library/2022-11-03-06-41-49.gh-issue-83004.301VK_.rst new file mode 100644 index 00000000000000..4d87236c7e2659 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-11-03-06-41-49.gh-issue-83004.301VK_.rst @@ -0,0 +1 @@ +Clean up refleaks on failed module initialisation in in :mod:`_ssl` and :mod:`_socket` diff --git a/Modules/_ssl.c b/Modules/_ssl.c index bf8bd9dea89b6b..fcbb269f465558 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -5925,8 +5925,7 @@ sslmodule_init_constants(PyObject *m) #define addbool(m, key, value) \ do { \ PyObject *bool_obj = (value) ? Py_True : Py_False; \ - Py_INCREF(bool_obj); \ - PyModule_AddObject((m), (key), bool_obj); \ + PyModule_AddObjectRef((m), (key), bool_obj); \ } while (0) addbool(m, "HAS_SNI", 1); @@ -6059,23 +6058,31 @@ sslmodule_init_versioninfo(PyObject *m) */ libver = OpenSSL_version_num(); r = PyLong_FromUnsignedLong(libver); - if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r)) + if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r)) { + Py_XDECREF(r); return -1; + } parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); r = Py_BuildValue("IIIII", major, minor, fix, patch, status); - if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r)) + if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r)) { + Py_XDECREF(r); return -1; + } r = PyUnicode_FromString(OpenSSL_version(OPENSSL_VERSION)); - if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r)) + if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r)) { + Py_XDECREF(r); return -1; + } libver = OPENSSL_VERSION_NUMBER; parse_openssl_version(libver, &major, &minor, &fix, &patch, &status); r = Py_BuildValue("IIIII", major, minor, fix, patch, status); - if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r)) + if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r)) { + Py_XDECREF(r); return -1; + } return 0; } diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 869bacde924d83..9b86007adaf174 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7342,29 +7342,26 @@ PyInit__socket(void) if (m == NULL) return NULL; - Py_INCREF(PyExc_OSError); - PyModule_AddObject(m, "error", PyExc_OSError); + if (PyModule_AddObjectRef(m, "error", PyExc_OSError) != 0) + return NULL; socket_herror = PyErr_NewException("socket.herror", PyExc_OSError, NULL); if (socket_herror == NULL) return NULL; - Py_INCREF(socket_herror); - PyModule_AddObject(m, "herror", socket_herror); + if (PyModule_AddObjectRef(m, "herror", socket_herror) != 0) + return NULL; socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError, - NULL); + NULL); if (socket_gaierror == NULL) return NULL; - Py_INCREF(socket_gaierror); - PyModule_AddObject(m, "gaierror", socket_gaierror); - PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError); + if (PyModule_AddObjectRef(m, "gaierror", socket_gaierror) != 0) + return NULL; + if (PyModule_AddObjectRef(m, "timeout", PyExc_TimeoutError) != 0) + return NULL; - Py_INCREF((PyObject *)&sock_type); - if (PyModule_AddObject(m, "SocketType", - (PyObject *)&sock_type) != 0) + if (PyModule_AddObjectRef(m, "SocketType", (PyObject *)&sock_type) != 0) return NULL; - Py_INCREF((PyObject *)&sock_type); - if (PyModule_AddObject(m, "socket", - (PyObject *)&sock_type) != 0) + if (PyModule_AddObjectRef(m, "socket", (PyObject *)&sock_type) != 0) return NULL; #ifdef ENABLE_IPV6 @@ -7372,8 +7369,7 @@ PyInit__socket(void) #else has_ipv6 = Py_False; #endif - Py_INCREF(has_ipv6); - PyModule_AddObject(m, "has_ipv6", has_ipv6); + PyModule_AddObjectRef(m, "has_ipv6", has_ipv6); /* Export C API */ PySocketModule_APIObject *capi = sock_get_api(); @@ -8666,7 +8662,8 @@ PyInit__socket(void) tmp = PyLong_FromUnsignedLong(codes[i]); if (tmp == NULL) return NULL; - PyModule_AddObject(m, names[i], tmp); + PyModule_AddObjectRef(m, names[i], tmp); + Py_DECREF(tmp); } } PyModule_AddIntMacro(m, RCVALL_OFF);