From 5d7e75c5d8c7492ae655ea38bb7ead4b868a2f17 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sat, 10 Jun 2023 16:35:14 +0200 Subject: [PATCH] Fix EINVAL returned on connect call to connecting socket --- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp | 8 ++++++++ rpcs3/Emu/Cell/lv2/sys_net/network_context.cpp | 4 ++-- rpcs3/Emu/Cell/lv2/sys_net/sys_net_helpers.cpp | 11 ++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp index b044a9671e..8718f3ac1c 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp @@ -211,12 +211,20 @@ std::optional lv2_socket_native::connect(const sys_net_sockaddr& addr) dnshook.add_dns_spy(lv2_id); } +#ifdef _WIN32 + bool was_connecting = connecting; +#endif + if (::connect(socket, reinterpret_cast(&native_addr), native_addr_len) == 0) { return CELL_OK; } +#ifdef _WIN32 + sys_net_error result = get_last_error(!so_nbio, was_connecting); +#else sys_net_error result = get_last_error(!so_nbio); +#endif if (result) { diff --git a/rpcs3/Emu/Cell/lv2/sys_net/network_context.cpp b/rpcs3/Emu/Cell/lv2/sys_net/network_context.cpp index 984ac20dfb..a49eea9564 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/network_context.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/network_context.cpp @@ -201,8 +201,8 @@ void network_thread::operator()() fds[i].revents = 0; #ifdef _WIN32 const auto cur_connecting = socklist[i]->is_connecting(); - was_connecting[i] = connecting; - connecting[i] = connecting; + was_connecting[i] = cur_connecting; + connecting[i] = cur_connecting; #endif } } diff --git a/rpcs3/Emu/Cell/lv2/sys_net/sys_net_helpers.cpp b/rpcs3/Emu/Cell/lv2/sys_net/sys_net_helpers.cpp index 637a842fe2..bcce88b679 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/sys_net_helpers.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/sys_net_helpers.cpp @@ -88,10 +88,15 @@ sys_net_error convert_error(bool is_blocking, int native_error, [[maybe_unused]] } #ifdef _WIN32 - // Windows will return SYS_NET_ENOTCONN when recvfrom/sendto is called on a socket that is connecting but not yet connected - if (is_connecting && result == SYS_NET_ENOTCONN) + if (is_connecting) { - return SYS_NET_EAGAIN; + // Windows will return SYS_NET_ENOTCONN when recvfrom/sendto is called on a socket that is connecting but not yet connected + if (result == SYS_NET_ENOTCONN) + return SYS_NET_EAGAIN; + + // See https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect + if (result == SYS_NET_EINVAL || result == SYS_NET_EWOULDBLOCK) + return SYS_NET_EALREADY; } #endif