From 824d332d0ffa6c532ac0ef783abdc9e19efb6474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Wed, 23 Jul 2025 20:34:25 +0200 Subject: [PATCH] Setsockopt fixes (#3308) * setsockopt: return correct error values for EPROCUNAVAIL * setsockopt: handle SO_CONNECTTIMEO --- src/core/libraries/network/posix_sockets.cpp | 6 ++++-- src/core/libraries/network/sockets.h | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 2df375262..238ed2d44 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -257,13 +257,14 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u3 CASE_SETSOCKOPT(SO_RCVTIMEO); CASE_SETSOCKOPT(SO_ERROR); CASE_SETSOCKOPT(SO_TYPE); + CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_CONNECTTIMEO, &sockopt_so_connecttimeo); CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_REUSEPORT, &sockopt_so_reuseport); CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_ONESBCAST, &sockopt_so_onesbcast); CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USECRYPTO, &sockopt_so_usecrypto); CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USESIGNATURE, &sockopt_so_usesignature); case ORBIS_NET_SO_LINGER: { if (socket_type != ORBIS_NET_SOCK_STREAM) { - return ORBIS_NET_EPROCUNAVAIL; + return ORBIS_NET_ERROR_EPROCUNAVAIL; } if (optlen < sizeof(OrbisNetLinger)) { LOG_ERROR(Lib_Net, "size missmatched! optlen = {} OrbisNetLinger={}", optlen, @@ -309,7 +310,7 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u3 CASE_SETSOCKOPT_VALUE(ORBIS_NET_IP_MAXTTL, &sockopt_ip_maxttl); case ORBIS_NET_IP_HDRINCL: { if (socket_type != ORBIS_NET_SOCK_RAW) { - return ORBIS_NET_EPROCUNAVAIL; + return ORBIS_NET_ERROR_EPROCUNAVAIL; } return ConvertReturnErrorCode( setsockopt(sock, level, optname, (const char*)optval, optlen)); @@ -361,6 +362,7 @@ int PosixSocket::GetSocketOptions(int level, int optname, void* optval, u32* opt CASE_GETSOCKOPT(SO_ERROR); CASE_GETSOCKOPT(SO_TYPE); CASE_GETSOCKOPT_VALUE(ORBIS_NET_SO_NBIO, sockopt_so_nbio); + CASE_GETSOCKOPT_VALUE(ORBIS_NET_SO_CONNECTTIMEO, sockopt_so_connecttimeo); CASE_GETSOCKOPT_VALUE(ORBIS_NET_SO_REUSEPORT, sockopt_so_reuseport); CASE_GETSOCKOPT_VALUE(ORBIS_NET_SO_ONESBCAST, sockopt_so_onesbcast); CASE_GETSOCKOPT_VALUE(ORBIS_NET_SO_USECRYPTO, sockopt_so_usecrypto); diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index c54e11e66..8a1e1d0ea 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -56,6 +56,7 @@ struct Socket { struct PosixSocket : public Socket { net_socket sock; + int sockopt_so_connecttimeo = 0; int sockopt_so_reuseport = 0; int sockopt_so_onesbcast = 0; int sockopt_so_usecrypto = 0;