@@ -7033,16 +7033,36 @@ os_init(void)
7033
7033
}
7034
7034
#endif
7035
7035
7036
+ static void
7037
+ sock_free_api (PySocketModule_APIObject * capi )
7038
+ {
7039
+ Py_DECREF (capi -> Sock_Type );
7040
+ Py_DECREF (capi -> error );
7041
+ Py_DECREF (capi -> timeout_error );
7042
+ PyMem_Free (capi );
7043
+ }
7036
7044
7037
- /* C API table - always add new things to the end for binary
7038
- compatibility. */
7039
- static
7040
- PySocketModule_APIObject PySocketModuleAPI =
7045
+ static void
7046
+ sock_destroy_api (PyObject * capsule )
7041
7047
{
7042
- & sock_type ,
7043
- NULL ,
7044
- NULL
7045
- };
7048
+ void * capi = PyCapsule_GetPointer (capsule , PySocket_CAPSULE_NAME );
7049
+ sock_free_api (capi );
7050
+ }
7051
+
7052
+ static PySocketModule_APIObject *
7053
+ sock_get_api (void )
7054
+ {
7055
+ PySocketModule_APIObject * capi = PyMem_Malloc (sizeof (PySocketModule_APIObject ));
7056
+ if (capi == NULL ) {
7057
+ PyErr_NoMemory ();
7058
+ return NULL ;
7059
+ }
7060
+
7061
+ capi -> Sock_Type = (PyTypeObject * )Py_NewRef (& sock_type );
7062
+ capi -> error = Py_NewRef (PyExc_OSError );
7063
+ capi -> timeout_error = Py_NewRef (PyExc_TimeoutError );
7064
+ return capi ;
7065
+ }
7046
7066
7047
7067
7048
7068
/* Initialize the _socket module.
@@ -7091,8 +7111,6 @@ PyInit__socket(void)
7091
7111
if (m == NULL )
7092
7112
return NULL ;
7093
7113
7094
- Py_INCREF (PyExc_OSError );
7095
- PySocketModuleAPI .error = PyExc_OSError ;
7096
7114
Py_INCREF (PyExc_OSError );
7097
7115
PyModule_AddObject (m , "error" , PyExc_OSError );
7098
7116
socket_herror = PyErr_NewException ("socket.herror" ,
@@ -7107,8 +7125,6 @@ PyInit__socket(void)
7107
7125
return NULL ;
7108
7126
Py_INCREF (socket_gaierror );
7109
7127
PyModule_AddObject (m , "gaierror" , socket_gaierror );
7110
-
7111
- PySocketModuleAPI .timeout_error = PyExc_TimeoutError ;
7112
7128
PyModule_AddObjectRef (m , "timeout" , PyExc_TimeoutError );
7113
7129
7114
7130
Py_INCREF ((PyObject * )& sock_type );
@@ -7129,10 +7145,24 @@ PyInit__socket(void)
7129
7145
PyModule_AddObject (m , "has_ipv6" , has_ipv6 );
7130
7146
7131
7147
/* Export C API */
7132
- if (PyModule_AddObject (m , PySocket_CAPI_NAME ,
7133
- PyCapsule_New (& PySocketModuleAPI , PySocket_CAPSULE_NAME , NULL )
7134
- ) != 0 )
7148
+ PySocketModule_APIObject * capi = sock_get_api ();
7149
+ if (capi == NULL ) {
7150
+ Py_DECREF (m );
7151
+ return NULL ;
7152
+ }
7153
+ PyObject * capsule = PyCapsule_New (capi ,
7154
+ PySocket_CAPSULE_NAME ,
7155
+ sock_destroy_api );
7156
+ if (capsule == NULL ) {
7157
+ sock_free_api (capi );
7158
+ Py_DECREF (m );
7159
+ return NULL ;
7160
+ }
7161
+ if (PyModule_AddObject (m , PySocket_CAPI_NAME , capsule ) < 0 ) {
7162
+ Py_DECREF (capsule );
7163
+ Py_DECREF (m );
7135
7164
return NULL ;
7165
+ }
7136
7166
7137
7167
/* Address families (we only support AF_INET and AF_UNIX) */
7138
7168
#ifdef AF_UNSPEC
0 commit comments