authorgravatar for bblack@wikimedia.orgBrandon Black <bblack@wikimedia.org> 2025-09-03 09:07:32-05:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-09-03 22:01:45+02:00
log048f9126b8f2b41f9ef103025bafc2773a62d82a
tree128af8b050c3a4d96f99ba430c9af97bd0e7b16f
parent18bdd0e9a4929e93f71b9600f7853f7d1b49f812

Return runtime err for EISCONN when connecting

Fixes #25063

1 files changed, 6 insertions(+), 3 deletions(-)

lib/std/posix.zig+6-3
...@@ -4285,6 +4285,9 @@ pub const ConnectError = error{...@@ -4285,6 +4285,9 @@ pub const ConnectError = error{
42854285
4286 /// Socket is non-blocking and already has a pending connection in progress.4286 /// Socket is non-blocking and already has a pending connection in progress.
4287 ConnectionPending,4287 ConnectionPending,
4288
4289 /// Socket was already connected
4290 AlreadyConnected,
4288} || UnexpectedError;4291} || UnexpectedError;
42894292
4290/// Initiate a connection on a socket.4293/// Initiate a connection on a socket.
...@@ -4305,7 +4308,7 @@ pub fn connect(sock: socket_t, sock_addr: *const sockaddr, len: socklen_t) Conne...@@ -4305,7 +4308,7 @@ pub fn connect(sock: socket_t, sock_addr: *const sockaddr, len: socklen_t) Conne
4305 => return error.NetworkUnreachable,4308 => return error.NetworkUnreachable,
4306 .WSAEFAULT => unreachable,4309 .WSAEFAULT => unreachable,
4307 .WSAEINVAL => unreachable,4310 .WSAEINVAL => unreachable,
4308 .WSAEISCONN => unreachable,4311 .WSAEISCONN => return error.AlreadyConnected,
4309 .WSAENOTSOCK => unreachable,4312 .WSAENOTSOCK => unreachable,
4310 .WSAEWOULDBLOCK => return error.WouldBlock,4313 .WSAEWOULDBLOCK => return error.WouldBlock,
4311 .WSAEACCES => unreachable,4314 .WSAEACCES => unreachable,
...@@ -4331,7 +4334,7 @@ pub fn connect(sock: socket_t, sock_addr: *const sockaddr, len: socklen_t) Conne...@@ -4331,7 +4334,7 @@ pub fn connect(sock: socket_t, sock_addr: *const sockaddr, len: socklen_t) Conne
4331 .CONNRESET => return error.ConnectionResetByPeer,4334 .CONNRESET => return error.ConnectionResetByPeer,
4332 .FAULT => unreachable, // The socket structure address is outside the user's address space.4335 .FAULT => unreachable, // The socket structure address is outside the user's address space.
4333 .INTR => continue,4336 .INTR => continue,
4334 .ISCONN => unreachable, // The socket is already connected.4337 .ISCONN => return error.AlreadyConnected, // The socket is already connected.
4335 .HOSTUNREACH => return error.NetworkUnreachable,4338 .HOSTUNREACH => return error.NetworkUnreachable,
4336 .NETUNREACH => return error.NetworkUnreachable,4339 .NETUNREACH => return error.NetworkUnreachable,
4337 .NOTSOCK => unreachable, // The file descriptor sockfd does not refer to a socket.4340 .NOTSOCK => unreachable, // The file descriptor sockfd does not refer to a socket.
...@@ -4391,7 +4394,7 @@ pub fn getsockoptError(sockfd: fd_t) ConnectError!void {...@@ -4391,7 +4394,7 @@ pub fn getsockoptError(sockfd: fd_t) ConnectError!void {
4391 .BADF => unreachable, // sockfd is not a valid open file descriptor.4394 .BADF => unreachable, // sockfd is not a valid open file descriptor.
4392 .CONNREFUSED => return error.ConnectionRefused,4395 .CONNREFUSED => return error.ConnectionRefused,
4393 .FAULT => unreachable, // The socket structure address is outside the user's address space.4396 .FAULT => unreachable, // The socket structure address is outside the user's address space.
4394 .ISCONN => unreachable, // The socket is already connected.4397 .ISCONN => return error.AlreadyConnected, // The socket is already connected.
4395 .HOSTUNREACH => return error.NetworkUnreachable,4398 .HOSTUNREACH => return error.NetworkUnreachable,
4396 .NETUNREACH => return error.NetworkUnreachable,4399 .NETUNREACH => return error.NetworkUnreachable,
4397 .NOTSOCK => unreachable, // The file descriptor sockfd does not refer to a socket.4400 .NOTSOCK => unreachable, // The file descriptor sockfd does not refer to a socket.