Skip to content

Commit

Permalink
pythongh-84808: socket.connect_ex: Handle negative errno (pythonGH-12…
Browse files Browse the repository at this point in the history
…2304)

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.
  • Loading branch information
korli authored Sep 9, 2024
1 parent d8f3c1e commit 65fcaa3
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -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.
19 changes: 17 additions & 2 deletions Modules/socketmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 65fcaa3

Please sign in to comment.