From 67f632b6deb8b4aa190c458b71d2bc8c793626d5 Mon Sep 17 00:00:00 2001 From: Matthew Zipkin Date: Fri, 12 Sep 2025 12:38:01 -0400 Subject: [PATCH] net: remove unnecessary casts in socket operations These methods in the Sock class wrap corresponding syscalls, accepting void* arguments and casting to char* internally, which is needed for Windows support and ignored on other platforms because the syscall itself accepts void*: Send() Recv() GetSockOpt() SetSockOpt() --- src/compat/compat.h | 8 -------- src/httpserver.cpp | 2 +- src/net.cpp | 8 ++++---- src/netbase.cpp | 4 ++-- src/test/sock_tests.cpp | 2 +- 5 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/compat/compat.h b/src/compat/compat.h index 05210b74bad10..acb57b2607498 100644 --- a/src/compat/compat.h +++ b/src/compat/compat.h @@ -75,14 +75,6 @@ typedef unsigned int SOCKET; typedef SSIZE_T ssize_t; #endif -// The type of the option value passed to getsockopt & setsockopt -// differs between Windows and non-Windows. -#ifndef WIN32 -typedef void* sockopt_arg_type; -#else -typedef char* sockopt_arg_type; -#endif - #ifdef WIN32 // Export main() and ensure working ASLR when using mingw-w64. // Exporting a symbol will prevent the linker from stripping diff --git a/src/httpserver.cpp b/src/httpserver.cpp index 4d496cfa34da1..684b85fac1a54 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -401,7 +401,7 @@ static bool HTTPBindAddresses(struct evhttp* http) // Set the no-delay option (disable Nagle's algorithm) on the TCP socket. evutil_socket_t fd = evhttp_bound_socket_get_fd(bind_handle); int one = 1; - if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (sockopt_arg_type)&one, sizeof(one)) == SOCKET_ERROR) { + if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&one), sizeof(one)) == SOCKET_ERROR) { LogInfo("WARNING: Unable to set TCP_NODELAY on RPC server socket, continuing anyway\n"); } boundSockets.push_back(bind_handle); diff --git a/src/net.cpp b/src/net.cpp index aab8782f3d325..675a1f9fa02bf 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1638,7 +1638,7 @@ std::pair CConnman::SocketSendData(CNode& node) const flags |= MSG_MORE; } #endif - nBytes = node.m_sock->Send(reinterpret_cast(data.data()), data.size(), flags); + nBytes = node.m_sock->Send(data.data(), data.size(), flags); } if (nBytes > 0) { node.m_last_send = GetTime(); @@ -3136,7 +3136,7 @@ bool CConnman::BindListenPort(const CService& addrBind, bilingual_str& strError, // Allow binding if the port is still in TIME_WAIT state after // the program was closed and restarted. - if (sock->SetSockOpt(SOL_SOCKET, SO_REUSEADDR, (sockopt_arg_type)&nOne, sizeof(int)) == SOCKET_ERROR) { + if (sock->SetSockOpt(SOL_SOCKET, SO_REUSEADDR, &nOne, sizeof(int)) == SOCKET_ERROR) { strError = Untranslated(strprintf("Error setting SO_REUSEADDR on socket: %s, continuing anyway", NetworkErrorString(WSAGetLastError()))); LogPrintf("%s\n", strError.original); } @@ -3145,14 +3145,14 @@ bool CConnman::BindListenPort(const CService& addrBind, bilingual_str& strError, // and enable it by default or not. Try to enable it, if possible. if (addrBind.IsIPv6()) { #ifdef IPV6_V6ONLY - if (sock->SetSockOpt(IPPROTO_IPV6, IPV6_V6ONLY, (sockopt_arg_type)&nOne, sizeof(int)) == SOCKET_ERROR) { + if (sock->SetSockOpt(IPPROTO_IPV6, IPV6_V6ONLY, &nOne, sizeof(int)) == SOCKET_ERROR) { strError = Untranslated(strprintf("Error setting IPV6_V6ONLY on socket: %s, continuing anyway", NetworkErrorString(WSAGetLastError()))); LogPrintf("%s\n", strError.original); } #endif #ifdef WIN32 int nProtLevel = PROTECTION_LEVEL_UNRESTRICTED; - if (sock->SetSockOpt(IPPROTO_IPV6, IPV6_PROTECTION_LEVEL, (const char*)&nProtLevel, sizeof(int)) == SOCKET_ERROR) { + if (sock->SetSockOpt(IPPROTO_IPV6, IPV6_PROTECTION_LEVEL, &nProtLevel, sizeof(int)) == SOCKET_ERROR) { strError = Untranslated(strprintf("Error setting IPV6_PROTECTION_LEVEL on socket: %s, continuing anyway", NetworkErrorString(WSAGetLastError()))); LogPrintf("%s\n", strError.original); } diff --git a/src/netbase.cpp b/src/netbase.cpp index 06593312d12f0..67928aa186027 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -551,7 +551,7 @@ std::unique_ptr CreateSockOS(int domain, int type, int protocol) int set = 1; // Set the no-sigpipe option on the socket for BSD systems, other UNIXes // should use the MSG_NOSIGNAL flag for every send. - if (sock->SetSockOpt(SOL_SOCKET, SO_NOSIGPIPE, (void*)&set, sizeof(int)) == SOCKET_ERROR) { + if (sock->SetSockOpt(SOL_SOCKET, SO_NOSIGPIPE, &set, sizeof(int)) == SOCKET_ERROR) { LogPrintf("Error setting SO_NOSIGPIPE on socket: %s, continuing anyway\n", NetworkErrorString(WSAGetLastError())); } @@ -620,7 +620,7 @@ static bool ConnectToSocket(const Sock& sock, struct sockaddr* sockaddr, socklen // sockerr here. int sockerr; socklen_t sockerr_len = sizeof(sockerr); - if (sock.GetSockOpt(SOL_SOCKET, SO_ERROR, (sockopt_arg_type)&sockerr, &sockerr_len) == + if (sock.GetSockOpt(SOL_SOCKET, SO_ERROR, &sockerr, &sockerr_len) == SOCKET_ERROR) { LogPrintf("getsockopt() for %s failed: %s\n", dest_str, NetworkErrorString(WSAGetLastError())); return false; diff --git a/src/test/sock_tests.cpp b/src/test/sock_tests.cpp index 5dd73dc101610..06d9f7d3ef606 100644 --- a/src/test/sock_tests.cpp +++ b/src/test/sock_tests.cpp @@ -24,7 +24,7 @@ static bool SocketIsClosed(const SOCKET& s) // wrongly pretend that the socket is not closed. int type; socklen_t len = sizeof(type); - return getsockopt(s, SOL_SOCKET, SO_TYPE, (sockopt_arg_type)&type, &len) == SOCKET_ERROR; + return getsockopt(s, SOL_SOCKET, SO_TYPE, reinterpret_cast(&type), &len) == SOCKET_ERROR; } static SOCKET CreateSocket()