From be09b943d4c9277980d6fd979570055ab4ac9f2e Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 7 Feb 2026 08:29:40 +0000 Subject: [PATCH] [core/hle/services/sockets] allow 'valid' range from [16,255] for IPv4 Signed-off-by: lizzie --- src/core/hle/service/sockets/bsd.cpp | 8 ++++---- src/core/hle/service/sockets/sfdnsres.cpp | 4 ++-- src/core/hle/service/sockets/sockets.h | 3 ++- src/core/hle/service/sockets/sockets_translate.cpp | 10 +++------- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index fd758d4915..c26f1796cc 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -629,7 +629,7 @@ Errno BSD::BindImpl(s32 fd, std::span addr) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } - ASSERT(addr.size() == sizeof(SockAddrIn)); + ASSERT(addr.size() >= 16); auto addr_in = GetValue(addr); return Translate(file_descriptors[fd]->socket->Bind(Translate(addr_in))); @@ -640,7 +640,7 @@ Errno BSD::ConnectImpl(s32 fd, std::span addr) { return Errno::BADF; } - UNIMPLEMENTED_IF(addr.size() != sizeof(SockAddrIn)); + ASSERT(addr.size() >= 16); auto addr_in = GetValue(addr); const Errno result = Translate(file_descriptors[fd]->socket->Connect(Translate(addr_in))); @@ -874,7 +874,7 @@ std::pair BSD::RecvFromImpl(s32 fd, u32 flags, std::vector& mess if (ret < 0) { addr.clear(); } else { - ASSERT(addr.size() == sizeof(SockAddrIn)); + ASSERT(addr.size() >= 16); const SockAddrIn result = Translate(addr_in); PutValue(addr, result); } @@ -899,7 +899,7 @@ std::pair BSD::SendToImpl(s32 fd, u32 flags, std::span mes Network::SockAddrIn addr_in; Network::SockAddrIn* p_addr_in = nullptr; if (!addr.empty()) { - ASSERT(addr.size() == sizeof(SockAddrIn)); + ASSERT(addr.size() >= 16); auto guest_addr_in = GetValue(addr); addr_in = Translate(guest_addr_in); p_addr_in = &addr_in; diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index 68d73f0a59..4fc962b369 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -235,7 +235,7 @@ static std::vector SerializeAddrInfo(const std::vector& v Append(data, static_cast(Translate(addrinfo.family))); // ai_family Append(data, static_cast(Translate(addrinfo.socket_type))); // ai_socktype Append(data, static_cast(Translate(addrinfo.protocol))); // ai_protocol - Append(data, sizeof(SockAddrIn)); // ai_addrlen + Append(data, 16); // ai_addrlen // ^ *not* sizeof(SerializedSockAddrIn), not that it matters since they're the same size // ai_addr: diff --git a/src/core/hle/service/sockets/sockets.h b/src/core/hle/service/sockets/sockets.h index b72bf53c16..7992d9822c 100644 --- a/src/core/hle/service/sockets/sockets.h +++ b/src/core/hle/service/sockets/sockets.h @@ -110,8 +110,9 @@ struct SockAddrIn { u8 family; u16 portno; std::array ip; - std::array zeroes; + std::array zeroes; }; +static_assert(sizeof(SockAddrIn) == 0x100); enum class PollEvents : u16 { // Using Pascal case because IN is a macro on Windows. diff --git a/src/core/hle/service/sockets/sockets_translate.cpp b/src/core/hle/service/sockets/sockets_translate.cpp index 9d82d347eb..a35a54c407 100644 --- a/src/core/hle/service/sockets/sockets_translate.cpp +++ b/src/core/hle/service/sockets/sockets_translate.cpp @@ -265,13 +265,9 @@ PollEvents Translate(Network::PollEvents flags) { } Network::SockAddrIn Translate(SockAddrIn value) { - if (value.len != 0 && value.len != sizeof(value) && value.len != 6) { - LOG_WARNING(Service, "Unexpected SockAddrIn len={}, expected 0, {}, or 6", - value.len, sizeof(value)); - } - + // All lengths are valid, from [0 upto 256] return { - .family = Translate(static_cast(value.family)), + .family = Translate(Domain(value.family)), .ip = value.ip, .portno = static_cast(value.portno >> 8 | value.portno << 8), }; @@ -279,7 +275,7 @@ Network::SockAddrIn Translate(SockAddrIn value) { SockAddrIn Translate(Network::SockAddrIn value) { return { - .len = sizeof(SockAddrIn), + .len = 16, .family = static_cast(Translate(value.family)), .portno = static_cast(value.portno >> 8 | value.portno << 8), .ip = value.ip,