From 85324599a6b09c33f11a5b9a9d46288a4dc77c66 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Mon, 11 Aug 2025 20:59:44 +1000 Subject: [PATCH] sockets/network: relax SockAddrIn len check and fix port byte-order to avoid SSBU crashes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Accept SockAddrIn len in [6, sizeof] and warn instead of asserting to handle libnx/SSBU quirks - Ensure TranslateFromSockAddrIn sets sin_port via htons(uint16_t) for consistent network byte-order - Prevents assertion crashes and reduces “Broken pipe” error spam observed in Frozen's SSBU logs Signed-off-by: Zephyron --- src/core/hle/service/sockets/sockets_translate.cpp | 9 ++++++++- src/core/internal_network/network.cpp | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/core/hle/service/sockets/sockets_translate.cpp b/src/core/hle/service/sockets/sockets_translate.cpp index 21bb3e776..b56cec9cb 100644 --- a/src/core/hle/service/sockets/sockets_translate.cpp +++ b/src/core/hle/service/sockets/sockets_translate.cpp @@ -4,6 +4,7 @@ #include #include "common/assert.h" +#include "common/logging/log.h" #include "common/common_types.h" #include "core/hle/service/sockets/sockets.h" #include "core/hle/service/sockets/sockets_translate.h" @@ -261,7 +262,13 @@ PollEvents Translate(Network::PollEvents flags) { Network::SockAddrIn Translate(SockAddrIn value) { // Note: 6 is incorrect, but can be passed by homebrew (because libnx sets // sin_len to 6 when deserializing getaddrinfo results). - ASSERT(value.len == 0 || value.len == sizeof(value) || value.len == 6); + // Some titles may pass other small values. Do not assert; instead, accept any + // length in [6, sizeof(value)] as valid and warn once if it's unexpected. + if (!(value.len == 0 || value.len == sizeof(value) || + (value.len >= 6 && value.len <= sizeof(value)))) { + LOG_WARNING(Service, "Unexpected SockAddrIn len={} (expected 0, 6, or {})", + value.len, sizeof(value)); + } return { .family = Translate(static_cast(value.family)), diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index df6d3cc65..117d8b768 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -91,7 +91,8 @@ sockaddr TranslateFromSockAddrIn(SockAddrIn input) { break; } - result.sin_port = htons(input.portno); + // input.portno is already in host byte order in our abstraction. Ensure network order here. + result.sin_port = htons(static_cast(input.portno)); auto& ip = result.sin_addr.S_un.S_un_b; ip.s_b1 = input.ip[0];