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