mirror of https://github.com/python/cpython
gh-84808: socket.connect_ex: Handle negative errno (GH-122304)
POSIX allows errno to be negative. Even though all currently supported platforms have non-negative errno, relying on a quirk like that would make Python less portable.
This commit is contained in:
parent
d8f3c1e8f9
commit
65fcaa38ad
|
@ -0,0 +1,3 @@
|
|||
Fix error handling in :py:class:`~socket.socket` method
|
||||
:py:func:`~socket.socket.connect_ex` on platforms where
|
||||
:c:data:`errno` can be negative.
|
|
@ -3421,6 +3421,18 @@ sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* Common functionality for socket.connect and socket.connect_ex.
|
||||
*
|
||||
* If *raise* is set:
|
||||
* - On success, return 0.
|
||||
* - On any failure, return -1 with an exception set.
|
||||
* If *raise* is zero:
|
||||
* - On success, return 0.
|
||||
* - On connect() failure, return errno (without an exception set)
|
||||
* - On other error, return -1 with an exception set.
|
||||
*
|
||||
* Note that -1 is a valid errno value on some systems.
|
||||
*/
|
||||
static int
|
||||
internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
|
||||
int raise)
|
||||
|
@ -3505,8 +3517,10 @@ sock_connect(PySocketSockObject *s, PyObject *addro)
|
|||
}
|
||||
|
||||
res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
|
||||
if (res < 0)
|
||||
if (res < 0) {
|
||||
assert(PyErr_Occurred());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
@ -3536,8 +3550,9 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro)
|
|||
}
|
||||
|
||||
res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
|
||||
if (res < 0)
|
||||
if (res == -1 && PyErr_Occurred()) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return PyLong_FromLong((long) res);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue