From 432d6da7c1ec9d52b2ec20c4004c0263297342af Mon Sep 17 00:00:00 2001 From: Zephyron Date: Sun, 24 Aug 2025 16:39:39 +1000 Subject: [PATCH] fix(network): prevent datagram socket SendTo errors in HDR multiplayer Changes: - Add validation in BSD::SendToImpl to check for empty address buffers on datagram sockets and return EINVAL instead of passing nullptr to sendto() - Add null pointer check in ProxySocket::SendTo to prevent dereferencing nullptr address parameters - Improve error logging to help identify socket configuration issues Fixes: Socket operation errors in HDR multiplayer sessions Signed-off-by: Zephyron --- src/core/hle/service/sockets/bsd.cpp | 8 ++++++++ src/core/internal_network/socket_proxy.cpp | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index 4bd74baaf..15e8f7d85 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -889,6 +889,14 @@ std::pair BSD::SendToImpl(s32 fd, u32 flags, std::span mes return {-1, Errno::BADF}; } + FileDescriptor& descriptor = *file_descriptors[fd]; + + // For datagram sockets (UDP), a destination address is required + if (!descriptor.is_connection_based && addr.empty()) { + LOG_ERROR(Service, "SendTo called on datagram socket without destination address"); + return {-1, Errno::INVAL}; + } + Network::SockAddrIn addr_in; Network::SockAddrIn* p_addr_in = nullptr; if (!addr.empty()) { diff --git a/src/core/internal_network/socket_proxy.cpp b/src/core/internal_network/socket_proxy.cpp index a2972203f..4c176bec4 100644 --- a/src/core/internal_network/socket_proxy.cpp +++ b/src/core/internal_network/socket_proxy.cpp @@ -205,6 +205,12 @@ std::pair ProxySocket::SendTo(u32 flags, std::span message return {static_cast(message.size()), Errno::SUCCESS}; } + // For datagram sockets, a destination address is required + if (!addr) { + LOG_ERROR(Network, "SendTo called on ProxySocket without destination address"); + return {-1, Errno::INVAL}; + } + if (auto room_member = room_network.GetRoomMember().lock()) { if (!room_member->IsConnected()) { return {static_cast(message.size()), Errno::SUCCESS};