@@ -7079,13 +7079,56 @@ static struct PyModuleDef socketmodule = {
7079
7079
NULL
7080
7080
};
7081
7081
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
+
7082
7124
PyMODINIT_FUNC
7083
7125
PyInit__socket (void )
7084
7126
{
7085
- PyObject * m , * has_ipv6 ;
7127
+ PyObject * m = NULL , * has_ipv6 ;
7086
7128
7087
- if (!os_init ())
7088
- return NULL ;
7129
+ if (!os_init ()) {
7130
+ goto error ;
7131
+ }
7089
7132
7090
7133
#ifdef MS_WINDOWS
7091
7134
if (support_wsa_no_inherit == -1 ) {
@@ -7094,43 +7137,22 @@ PyInit__socket(void)
7094
7137
#endif
7095
7138
7096
7139
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 ;
7105
7142
}
7106
7143
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 ;
7132
7146
}
7133
7147
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
+
7134
7156
#ifdef ENABLE_IPV6
7135
7157
has_ipv6 = Py_True ;
7136
7158
#else
@@ -8395,4 +8417,10 @@ PyInit__socket(void)
8395
8417
#endif
8396
8418
8397
8419
return m ;
8420
+
8421
+ error :
8422
+ socket_free_state (m );
8423
+ Py_XDECREF (m );
8424
+ return NULL ;
8398
8425
}
8426
+ #undef ADD_OBJ_REF
0 commit comments