From: Victor Stinner Date: Tue, 31 Mar 2015 19:28:42 +0000 (+0200) Subject: Issue #23618: Fix EINTR handling in socket.connect() X-Git-Tag: v3.5.0a4~228 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ee699e9d2b8dbac53ee897ddd456ec7399d703de;p=thirdparty%2FPython%2Fcpython.git Issue #23618: Fix EINTR handling in socket.connect() Call PyErr_CheckSignals() if connect(), select() or getsockopt() failed with EINTR. --- diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 211e77bb7b7d..65651874a24f 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -2502,6 +2502,9 @@ internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen, } *timeoutp = timeout; + if (err == EINTR && PyErr_CheckSignals()) + return -1; + assert(err >= 0); return err; @@ -2524,13 +2527,14 @@ sock_connect(PySocketSockObject *s, PyObject *addro) return NULL; res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout); + if (res < 0) + return NULL; if (timeout == 1) { PyErr_SetString(socket_timeout, "timed out"); return NULL; } - if (res < 0) - return NULL; + if (res != 0) { #ifdef MS_WINDOWS WSASetLastError(res); @@ -2539,8 +2543,8 @@ sock_connect(PySocketSockObject *s, PyObject *addro) #endif return s->errorhandler(); } - Py_INCREF(Py_None); - return Py_None; + + Py_RETURN_NONE; } PyDoc_STRVAR(connect_doc, @@ -2564,15 +2568,9 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro) return NULL; res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout); - if (res < 0) return NULL; - /* Signals are not errors (though they may raise exceptions). Adapted - from PyErr_SetFromErrnoWithFilenameObject(). */ - if (res == EINTR && PyErr_CheckSignals()) - return NULL; - return PyLong_FromLong((long) res); }