Skip to content

Commit b41d9aa

Browse files
author
Erlend E. Aasland
committed
Clean up first part of init function
1 parent fc923e7 commit b41d9aa

File tree

1 file changed

+64
-36
lines changed

1 file changed

+64
-36
lines changed

Modules/socketmodule.c

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
70827124
PyMODINIT_FUNC
70837125
PyInit__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

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy