@@ -7079,13 +7079,56 @@ static struct PyModuleDef socketmodule = {
70797079 NULL
70807080};
70817081
7082+ static void
7083+ socket_free_state (PyObject * Py_UNUSED (module ))
7084+ {
7085+ socket_state * state = socket_get_state ();
7086+ Py_CLEAR (state -> sock_type );
7087+ Py_CLEAR (state -> socket_herror );
7088+ Py_CLEAR (state -> socket_gaierror );
7089+ }
7090+
7091+ static int
7092+ socket_init_state (PyObject * module )
7093+ {
7094+ socket_state * state = socket_get_state ();
7095+ state -> sock_type = (PyTypeObject * )PyType_FromModuleAndSpec (module , & sock_spec , NULL );
7096+ if (state -> sock_type == NULL ) {
7097+ goto error ;
7098+ }
7099+
7100+ state -> socket_herror = PyErr_NewException ("socket.herror" , PyExc_OSError , NULL );
7101+ if (state -> socket_herror == NULL ) {
7102+ goto error ;
7103+ }
7104+
7105+ state -> socket_gaierror = PyErr_NewException ("socket.gaierror" , PyExc_OSError , NULL );
7106+ if (state -> socket_gaierror == NULL ) {
7107+ goto error ;
7108+ }
7109+
7110+ return 0 ;
7111+
7112+ error :
7113+ socket_free_state (module );
7114+ return -1 ;
7115+ }
7116+
7117+ #define ADD_OBJ_REF (module , name , obj ) \
7118+ do { \
7119+ if (PyModule_AddObjectRef(module, name, obj) < 0) { \
7120+ goto error; \
7121+ } \
7122+ } while (0)
7123+
70827124PyMODINIT_FUNC
70837125PyInit__socket (void )
70847126{
7085- PyObject * m , * has_ipv6 ;
7127+ PyObject * m = NULL , * has_ipv6 ;
70867128
7087- if (!os_init ())
7088- return NULL ;
7129+ if (!os_init ()) {
7130+ goto error ;
7131+ }
70897132
70907133#ifdef MS_WINDOWS
70917134 if (support_wsa_no_inherit == -1 ) {
@@ -7094,43 +7137,22 @@ PyInit__socket(void)
70947137#endif
70957138
70967139 m = PyModule_Create (& socketmodule );
7097- if (m == NULL )
7098- return NULL ;
7099-
7100- socket_state * state = socket_get_state ();
7101- state -> sock_type = (PyTypeObject * )PyType_FromModuleAndSpec (m , & sock_spec , NULL );
7102- if (!state -> sock_type ) {
7103- Py_DECREF (m );
7104- return NULL ;
7140+ if (m == NULL ) {
7141+ goto error ;
71057142 }
71067143
7107- Py_INCREF (PyExc_OSError );
7108- PyModule_AddObject (m , "error" , PyExc_OSError );
7109- state -> socket_herror = PyErr_NewException ("socket.herror" ,
7110- PyExc_OSError , NULL );
7111- if (state -> socket_herror == NULL )
7112- return NULL ;
7113- Py_INCREF (state -> socket_herror );
7114- PyModule_AddObject (m , "herror" , state -> socket_herror );
7115- state -> socket_gaierror = PyErr_NewException ("socket.gaierror" , PyExc_OSError ,
7116- NULL );
7117- if (state -> socket_gaierror == NULL )
7118- return NULL ;
7119- Py_INCREF (state -> socket_gaierror );
7120- PyModule_AddObject (m , "gaierror" , state -> socket_gaierror );
7121- PyModule_AddObjectRef (m , "timeout" , PyExc_TimeoutError );
7122-
7123- Py_INCREF (state -> sock_type );
7124- if (PyModule_AddObject (m , "SocketType" , (PyObject * )state -> sock_type ) < 0 ) {
7125- Py_CLEAR (state -> sock_type );
7126- return NULL ;
7127- }
7128- Py_INCREF ((PyObject * )state -> sock_type );
7129- if (PyModule_AddObject (m , "socket" , (PyObject * )state -> sock_type ) < 0 ) {
7130- Py_CLEAR (state -> sock_type );
7131- return NULL ;
7144+ if (socket_init_state (m )) {
7145+ goto error ;
71327146 }
71337147
7148+ socket_state * state = socket_get_state ();
7149+ ADD_OBJ_REF (m , "SocketType" , (PyObject * )state -> sock_type );
7150+ ADD_OBJ_REF (m , "socket" , (PyObject * )state -> sock_type );
7151+ ADD_OBJ_REF (m , "herror" , (PyObject * )state -> socket_herror );
7152+ ADD_OBJ_REF (m , "gaierror" , (PyObject * )state -> socket_gaierror );
7153+ ADD_OBJ_REF (m , "error" , PyExc_OSError );
7154+ ADD_OBJ_REF (m , "timeout" , PyExc_TimeoutError );
7155+
71347156#ifdef ENABLE_IPV6
71357157 has_ipv6 = Py_True ;
71367158#else
@@ -8395,4 +8417,10 @@ PyInit__socket(void)
83958417#endif
83968418
83978419 return m ;
8420+
8421+ error :
8422+ socket_free_state (m );
8423+ Py_XDECREF (m );
8424+ return NULL ;
83988425}
8426+ #undef ADD_OBJ_REF
0 commit comments