]> granicus.if.org Git - python/commitdiff
Issue #23618: Fix EINTR handling in socket.connect()
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 31 Mar 2015 19:28:42 +0000 (21:28 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 31 Mar 2015 19:28:42 +0000 (21:28 +0200)
Call PyErr_CheckSignals() if connect(), select() or getsockopt() failed with
EINTR.

Modules/socketmodule.c

index 211e77bb7b7d79e0d86aef0c2f7aae37c2f35d66..65651874a24f8ad41da2cf678835dc42b6117d9a 100644 (file)
@@ -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);
 }