changeset: 95335:4fad2b9fc4e6 user: Victor Stinner date: Tue Mar 31 21:28:42 2015 +0200 files: Modules/socketmodule.c description: Issue #23618: Fix EINTR handling in socket.connect() Call PyErr_CheckSignals() if connect(), select() or getsockopt() failed with EINTR. diff -r d9374864d4a9 -r 4fad2b9fc4e6 Modules/socketmodule.c --- a/Modules/socketmodule.c Tue Mar 31 21:23:10 2015 +0200 +++ b/Modules/socketmodule.c Tue Mar 31 21:28:42 2015 +0200 @@ -2502,6 +2502,9 @@ } *timeoutp = timeout; + if (err == EINTR && PyErr_CheckSignals()) + return -1; + assert(err >= 0); return err; @@ -2524,13 +2527,14 @@ 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 @@ #endif return s->errorhandler(); } - Py_INCREF(Py_None); - return Py_None; + + Py_RETURN_NONE; } PyDoc_STRVAR(connect_doc, @@ -2564,15 +2568,9 @@ 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); }