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};