From ea1715a25f25ad57c92857c0ab19a5572b614c0f Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 14 Mar 2026 14:57:20 +0000 Subject: [PATCH] [hle/sockets] fix crash when socket() isn't initialized but send()/recv() are called Signed-off-by: lizzie --- src/core/hle/service/sockets/bsd.cpp | 58 ++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index fd758d4915..4ed5d14bff 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -11,6 +11,7 @@ #include +#include "common/logging.h" #include "common/socket_types.h" #include "core/core.h" #include "core/hle/kernel/k_thread.h" @@ -629,6 +630,12 @@ Errno BSD::BindImpl(s32 fd, std::span addr) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } + + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return Errno::BADF; + } + ASSERT(addr.size() == sizeof(SockAddrIn)); auto addr_in = GetValue(addr); @@ -640,6 +647,11 @@ Errno BSD::ConnectImpl(s32 fd, std::span addr) { return Errno::BADF; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return Errno::BADF; + } + UNIMPLEMENTED_IF(addr.size() != sizeof(SockAddrIn)); auto addr_in = GetValue(addr); @@ -658,6 +670,11 @@ Errno BSD::GetPeerNameImpl(s32 fd, std::vector& write_buffer) { return Errno::BADF; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return Errno::BADF; + } + const auto [addr_in, bsd_errno] = file_descriptors[fd]->socket->GetPeerName(); if (bsd_errno != Network::Errno::SUCCESS) { return Translate(bsd_errno); @@ -675,6 +692,11 @@ Errno BSD::GetSockNameImpl(s32 fd, std::vector& write_buffer) { return Errno::BADF; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return Errno::BADF; + } + const auto [addr_in, bsd_errno] = file_descriptors[fd]->socket->GetSockName(); if (bsd_errno != Network::Errno::SUCCESS) { return Translate(bsd_errno); @@ -691,6 +713,10 @@ Errno BSD::ListenImpl(s32 fd, s32 backlog) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return Errno::BADF; + } return Translate(file_descriptors[fd]->socket->Listen(backlog)); } @@ -698,6 +724,10 @@ std::pair BSD::FcntlImpl(s32 fd, FcntlCmd cmd, s32 arg) { if (!IsFileDescriptorValid(fd)) { return {-1, Errno::BADF}; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return {-1, Errno::BADF}; + } FileDescriptor& descriptor = *file_descriptors[fd]; @@ -724,6 +754,10 @@ Errno BSD::GetSockOptImpl(s32 fd, u32 level, OptName optname, std::vector& o if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return Errno::BADF; + } if (level != static_cast(SocketLevel::SOCKET)) { UNIMPLEMENTED_MSG("Unknown getsockopt level"); @@ -755,6 +789,10 @@ Errno BSD::SetSockOptImpl(s32 fd, u32 level, OptName optname, std::spansocket) { + LOG_WARNING(Service, "Uninitialized socket"); + return Errno::BADF; + } if (level != static_cast(SocketLevel::SOCKET)) { LOG_WARNING(Service, "(STUBBED) setsockopt with level={}, optname={}", level, optname); @@ -805,6 +843,10 @@ Errno BSD::ShutdownImpl(s32 fd, s32 how) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return Errno::BADF; + } const Network::ShutdownHow host_how = Translate(static_cast(how)); return Translate(file_descriptors[fd]->socket->Shutdown(host_how)); } @@ -887,6 +929,10 @@ std::pair BSD::SendImpl(s32 fd, u32 flags, std::span messa if (!IsFileDescriptorValid(fd)) { return {-1, Errno::BADF}; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return {-1, Errno::BADF}; + } return Translate(file_descriptors[fd]->socket->Send(message, flags)); } @@ -895,6 +941,10 @@ std::pair BSD::SendToImpl(s32 fd, u32 flags, std::span mes if (!IsFileDescriptorValid(fd)) { return {-1, Errno::BADF}; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return {-1, Errno::BADF}; + } Network::SockAddrIn addr_in; Network::SockAddrIn* p_addr_in = nullptr; @@ -912,6 +962,10 @@ Errno BSD::CloseImpl(s32 fd) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return Errno::BADF; + } const Errno bsd_errno = Translate(file_descriptors[fd]->socket->Close()); if (bsd_errno != Errno::SUCCESS) { @@ -947,6 +1001,10 @@ std::optional> BSD::GetSocket(s32 fd) { if (!IsFileDescriptorValid(fd)) { return std::nullopt; } + if (!file_descriptors[fd]->socket) { + LOG_WARNING(Service, "Uninitialized socket"); + return std::nullopt; + } return file_descriptors[fd]->socket; }