mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-05-20 14:07:02 +02:00
[bsd, ssl] force ssl verify option to be 0 and other fixes (#3386)
JackBox games broke again, this makes it work again. Forces Verify Option to be 0 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3386 Reviewed-by: crueter <crueter@eden-emu.dev> Reviewed-by: MaranBr <maranbr@eden-emu.dev> Co-authored-by: Maufeat <sahyno1996@gmail.com> Co-committed-by: Maufeat <sahyno1996@gmail.com>
This commit is contained in:
parent
eb7f74ce97
commit
7396149ab1
10 changed files with 110 additions and 26 deletions
|
|
@ -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-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||||
|
|
@ -643,7 +643,14 @@ Errno BSD::ConnectImpl(s32 fd, std::span<const u8> addr) {
|
||||||
UNIMPLEMENTED_IF(addr.size() != sizeof(SockAddrIn));
|
UNIMPLEMENTED_IF(addr.size() != sizeof(SockAddrIn));
|
||||||
auto addr_in = GetValue<SockAddrIn>(addr);
|
auto addr_in = GetValue<SockAddrIn>(addr);
|
||||||
|
|
||||||
return Translate(file_descriptors[fd]->socket->Connect(Translate(addr_in)));
|
const Errno result = Translate(file_descriptors[fd]->socket->Connect(Translate(addr_in)));
|
||||||
|
|
||||||
|
if (result == Errno::ISCONN) {
|
||||||
|
LOG_DEBUG(Service, "returned ISCONN - socket already connected");
|
||||||
|
return Errno::SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Errno BSD::GetPeerNameImpl(s32 fd, std::vector<u8>& write_buffer) {
|
Errno BSD::GetPeerNameImpl(s32 fd, std::vector<u8>& write_buffer) {
|
||||||
|
|
@ -750,7 +757,7 @@ Errno BSD::SetSockOptImpl(s32 fd, u32 level, OptName optname, std::span<const u8
|
||||||
}
|
}
|
||||||
|
|
||||||
if (level != static_cast<u32>(SocketLevel::SOCKET)) {
|
if (level != static_cast<u32>(SocketLevel::SOCKET)) {
|
||||||
UNIMPLEMENTED_MSG("Unknown setsockopt level");
|
LOG_WARNING(Service, "(STUBBED) setsockopt with level={}, optname={}", level, optname);
|
||||||
return Errno::SUCCESS;
|
return Errno::SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||||
|
|
@ -29,6 +29,7 @@ enum class Errno : u32 {
|
||||||
TIMEDOUT = 110,
|
TIMEDOUT = 110,
|
||||||
CONNREFUSED = 111,
|
CONNREFUSED = 111,
|
||||||
INPROGRESS = 115,
|
INPROGRESS = 115,
|
||||||
|
ISCONN = 106,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class GetAddrInfoError : s32 {
|
enum class GetAddrInfoError : s32 {
|
||||||
|
|
@ -71,6 +72,8 @@ enum class Protocol : u32 {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class SocketLevel : u32 {
|
enum class SocketLevel : u32 {
|
||||||
|
IP = 0,
|
||||||
|
TCP = 6,
|
||||||
SOCKET = 0xffff, // i.e. SOL_SOCKET
|
SOCKET = 0xffff, // i.e. SOL_SOCKET
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -5,6 +8,7 @@
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
#include "common/logging/log.h"
|
||||||
#include "core/hle/service/sockets/sockets.h"
|
#include "core/hle/service/sockets/sockets.h"
|
||||||
#include "core/hle/service/sockets/sockets_translate.h"
|
#include "core/hle/service/sockets/sockets_translate.h"
|
||||||
#include "core/internal_network/network.h"
|
#include "core/internal_network/network.h"
|
||||||
|
|
@ -37,6 +41,8 @@ Errno Translate(Network::Errno value) {
|
||||||
return Errno::CONNRESET;
|
return Errno::CONNRESET;
|
||||||
case Network::Errno::INPROGRESS:
|
case Network::Errno::INPROGRESS:
|
||||||
return Errno::INPROGRESS;
|
return Errno::INPROGRESS;
|
||||||
|
case Network::Errno::ISCONN:
|
||||||
|
return Errno::ISCONN;
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED_MSG("Unimplemented errno={}", value);
|
UNIMPLEMENTED_MSG("Unimplemented errno={}", value);
|
||||||
return Errno::SUCCESS;
|
return Errno::SUCCESS;
|
||||||
|
|
@ -259,9 +265,10 @@ PollEvents Translate(Network::PollEvents flags) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Network::SockAddrIn Translate(SockAddrIn value) {
|
Network::SockAddrIn Translate(SockAddrIn value) {
|
||||||
// Note: 6 is incorrect, but can be passed by homebrew (because libnx sets
|
if (value.len != 0 && value.len != sizeof(value) && value.len != 6) {
|
||||||
// sin_len to 6 when deserializing getaddrinfo results).
|
LOG_WARNING(Service, "Unexpected SockAddrIn len={}, expected 0, {}, or 6",
|
||||||
ASSERT(value.len == 0 || value.len == sizeof(value) || value.len == 6);
|
value.len, sizeof(value));
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
.family = Translate(static_cast<Domain>(value.family)),
|
.family = Translate(static_cast<Domain>(value.family)),
|
||||||
|
|
|
||||||
|
|
@ -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-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||||
|
|
@ -116,6 +116,8 @@ public:
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
|
backend->SetVerifyOption(verify_option);
|
||||||
|
|
||||||
shared_data->connection_count++;
|
shared_data->connection_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -150,6 +152,7 @@ private:
|
||||||
std::shared_ptr<Network::SocketBase> socket;
|
std::shared_ptr<Network::SocketBase> socket;
|
||||||
std::vector<u8> next_alpn_proto;
|
std::vector<u8> next_alpn_proto;
|
||||||
bool did_handshake = false;
|
bool did_handshake = false;
|
||||||
|
u32 verify_option = 0;
|
||||||
|
|
||||||
Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) {
|
Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) {
|
||||||
LOG_DEBUG(Service_SSL, "called, fd={}", fd);
|
LOG_DEBUG(Service_SSL, "called, fd={}", fd);
|
||||||
|
|
@ -190,7 +193,9 @@ private:
|
||||||
|
|
||||||
Result SetVerifyOptionImpl(u32 option) {
|
Result SetVerifyOptionImpl(u32 option) {
|
||||||
ASSERT(!did_handshake);
|
ASSERT(!did_handshake);
|
||||||
LOG_WARNING(Service_SSL, "(STUBBED) called. option={}", option);
|
LOG_DEBUG(Service_SSL, "called. option={} (forcing 0)", option);
|
||||||
|
verify_option = 0;
|
||||||
|
backend->SetVerifyOption(0);
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -34,6 +37,7 @@ public:
|
||||||
virtual ~SSLConnectionBackend() {}
|
virtual ~SSLConnectionBackend() {}
|
||||||
virtual void SetSocket(std::shared_ptr<Network::SocketBase> socket) = 0;
|
virtual void SetSocket(std::shared_ptr<Network::SocketBase> socket) = 0;
|
||||||
virtual Result SetHostName(const std::string& hostname) = 0;
|
virtual Result SetHostName(const std::string& hostname) = 0;
|
||||||
|
virtual void SetVerifyOption(u32 option) = 0;
|
||||||
virtual Result DoHandshake() = 0;
|
virtual Result DoHandshake() = 0;
|
||||||
virtual Result Read(size_t* out_size, std::span<u8> data) = 0;
|
virtual Result Read(size_t* out_size, std::span<u8> data) = 0;
|
||||||
virtual Result Write(size_t* out_size, std::span<const u8> data) = 0;
|
virtual Result Write(size_t* out_size, std::span<const u8> data) = 0;
|
||||||
|
|
|
||||||
|
|
@ -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-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
|
|
@ -158,9 +158,11 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Result SetHostName(const std::string& hostname) override {
|
Result SetHostName(const std::string& hostname) override {
|
||||||
if (!SSL_set1_host(ssl, hostname.c_str())) { // hostname for verification
|
if (!skip_cert_verification) {
|
||||||
LOG_ERROR(Service_SSL, "SSL_set1_host({}) failed", hostname);
|
if (!SSL_set1_host(ssl, hostname.c_str())) {
|
||||||
return CheckOpenSSLErrors();
|
LOG_ERROR(Service_SSL, "SSL_set1_host({}) failed", hostname);
|
||||||
|
return CheckOpenSSLErrors();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!SSL_set_tlsext_host_name(ssl, hostname.c_str())) { // hostname for SNI
|
if (!SSL_set_tlsext_host_name(ssl, hostname.c_str())) { // hostname for SNI
|
||||||
LOG_ERROR(Service_SSL, "SSL_set_tlsext_host_name({}) failed", hostname);
|
LOG_ERROR(Service_SSL, "SSL_set_tlsext_host_name({}) failed", hostname);
|
||||||
|
|
@ -169,15 +171,32 @@ public:
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetVerifyOption(u32 option) override {
|
||||||
|
skip_cert_verification = (option == 0);
|
||||||
|
LOG_WARNING(Service_SSL, "option={} skip_verification={}", option,
|
||||||
|
skip_cert_verification);
|
||||||
|
if (skip_cert_verification) {
|
||||||
|
SSL_set_verify(ssl, SSL_VERIFY_NONE, nullptr);
|
||||||
|
SSL_set1_host(ssl, nullptr);
|
||||||
|
SSL_set_hostflags(ssl, 0);
|
||||||
|
} else {
|
||||||
|
SSL_set_verify(ssl, SSL_VERIFY_PEER, nullptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Result DoHandshake() override {
|
Result DoHandshake() override {
|
||||||
SSL_set_verify_result(ssl, X509_V_OK);
|
SSL_set_verify_result(ssl, X509_V_OK);
|
||||||
const int ret = SSL_do_handshake(ssl);
|
const int ret = SSL_do_handshake(ssl);
|
||||||
const long verify_result = SSL_get_verify_result(ssl);
|
|
||||||
if (verify_result != X509_V_OK) {
|
if (!skip_cert_verification) {
|
||||||
LOG_ERROR(Service_SSL, "SSL cert verification failed because: {}",
|
const long verify_result = SSL_get_verify_result(ssl);
|
||||||
X509_verify_cert_error_string(verify_result));
|
if (verify_result != X509_V_OK) {
|
||||||
return CheckOpenSSLErrors();
|
LOG_ERROR(Service_SSL, "SSL cert verification failed because: {}",
|
||||||
|
X509_verify_cert_error_string(verify_result));
|
||||||
|
return CheckOpenSSLErrors();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
const int ssl_err = SSL_get_error(ssl, ret);
|
const int ssl_err = SSL_get_error(ssl, ret);
|
||||||
if (ssl_err == SSL_ERROR_ZERO_RETURN ||
|
if (ssl_err == SSL_ERROR_ZERO_RETURN ||
|
||||||
|
|
@ -328,6 +347,7 @@ public:
|
||||||
SSL* ssl = nullptr;
|
SSL* ssl = nullptr;
|
||||||
BIO* bio = nullptr;
|
BIO* bio = nullptr;
|
||||||
bool got_read_eof = false;
|
bool got_read_eof = false;
|
||||||
|
bool skip_cert_verification = false;
|
||||||
|
|
||||||
std::shared_ptr<Network::SocketBase> socket;
|
std::shared_ptr<Network::SocketBase> socket;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
|
|
@ -89,6 +89,12 @@ public:
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetVerifyOption(u32 option) override {
|
||||||
|
skip_cert_verification = (option == 0);
|
||||||
|
LOG_WARNING(Service_SSL, "option={} skip_verification={}", option,
|
||||||
|
skip_cert_verification);
|
||||||
|
}
|
||||||
|
|
||||||
Result DoHandshake() override {
|
Result DoHandshake() override {
|
||||||
while (1) {
|
while (1) {
|
||||||
Result r;
|
Result r;
|
||||||
|
|
@ -175,10 +181,15 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Result CallInitializeSecurityContext() {
|
Result CallInitializeSecurityContext() {
|
||||||
const unsigned long req = ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_CONFIDENTIALITY |
|
unsigned long req = ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_CONFIDENTIALITY |
|
||||||
ISC_REQ_INTEGRITY | ISC_REQ_REPLAY_DETECT |
|
ISC_REQ_INTEGRITY | ISC_REQ_REPLAY_DETECT |
|
||||||
ISC_REQ_SEQUENCE_DETECT | ISC_REQ_STREAM |
|
ISC_REQ_SEQUENCE_DETECT | ISC_REQ_STREAM |
|
||||||
ISC_REQ_USE_SUPPLIED_CREDS;
|
ISC_REQ_USE_SUPPLIED_CREDS;
|
||||||
|
|
||||||
|
if (skip_cert_verification) {
|
||||||
|
req |= ISC_REQ_MANUAL_CRED_VALIDATION;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned long attr;
|
unsigned long attr;
|
||||||
// https://learn.microsoft.com/en-us/windows/win32/secauthn/initializesecuritycontext--schannel
|
// https://learn.microsoft.com/en-us/windows/win32/secauthn/initializesecuritycontext--schannel
|
||||||
std::array<SecBuffer, 2> input_buffers{{
|
std::array<SecBuffer, 2> input_buffers{{
|
||||||
|
|
@ -536,6 +547,7 @@ public:
|
||||||
std::vector<u8> cleartext_write_buf;
|
std::vector<u8> cleartext_write_buf;
|
||||||
|
|
||||||
bool got_read_eof = false;
|
bool got_read_eof = false;
|
||||||
|
bool skip_cert_verification = false;
|
||||||
size_t read_buf_fill_size = 0;
|
size_t read_buf_fill_size = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -98,8 +101,23 @@ public:
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetVerifyOption(u32 option) override {
|
||||||
|
skip_cert_verification = (option == 0);
|
||||||
|
LOG_WARNING(Service_SSL, "option={} skip_verification={}", option,
|
||||||
|
skip_cert_verification);
|
||||||
|
if (skip_cert_verification) {
|
||||||
|
SSLSetSessionOption(context, kSSLSessionOptionBreakOnServerAuth, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Result DoHandshake() override {
|
Result DoHandshake() override {
|
||||||
OSStatus status = SSLHandshake(context);
|
OSStatus status = SSLHandshake(context);
|
||||||
|
|
||||||
|
if (skip_cert_verification && status == errSSLServerAuthCompleted) {
|
||||||
|
LOG_DEBUG(Service_SSL, "Skipping certificate verification as requested");
|
||||||
|
status = SSLHandshake(context);
|
||||||
|
}
|
||||||
|
|
||||||
return HandleReturn("SSLHandshake", 0, status);
|
return HandleReturn("SSLHandshake", 0, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -201,6 +219,7 @@ public:
|
||||||
private:
|
private:
|
||||||
CFReleaser<SSLContextRef> context = nullptr;
|
CFReleaser<SSLContextRef> context = nullptr;
|
||||||
bool got_read_eof = false;
|
bool got_read_eof = false;
|
||||||
|
bool skip_cert_verification = false;
|
||||||
|
|
||||||
std::shared_ptr<Network::SocketBase> socket;
|
std::shared_ptr<Network::SocketBase> socket;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
|
|
@ -157,6 +157,8 @@ Errno TranslateNativeError(int e, CallType call_type = CallType::Other) {
|
||||||
return Errno::TIMEDOUT;
|
return Errno::TIMEDOUT;
|
||||||
case WSAEINPROGRESS:
|
case WSAEINPROGRESS:
|
||||||
return Errno::INPROGRESS;
|
return Errno::INPROGRESS;
|
||||||
|
case WSAEISCONN:
|
||||||
|
return Errno::ISCONN;
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED_MSG("Unimplemented errno={}", e);
|
UNIMPLEMENTED_MSG("Unimplemented errno={}", e);
|
||||||
return Errno::OTHER;
|
return Errno::OTHER;
|
||||||
|
|
@ -296,6 +298,8 @@ Errno TranslateNativeError(int e, CallType call_type = CallType::Other) {
|
||||||
return Errno::TIMEDOUT;
|
return Errno::TIMEDOUT;
|
||||||
case EINPROGRESS:
|
case EINPROGRESS:
|
||||||
return Errno::INPROGRESS;
|
return Errno::INPROGRESS;
|
||||||
|
case EISCONN:
|
||||||
|
return Errno::ISCONN;
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED_MSG("Unimplemented errno={} ({})", e, strerror(e));
|
UNIMPLEMENTED_MSG("Unimplemented errno={} ({})", e, strerror(e));
|
||||||
return Errno::OTHER;
|
return Errno::OTHER;
|
||||||
|
|
@ -872,7 +876,9 @@ std::pair<s32, Errno> Socket::SendTo(u32 flags, std::span<const u8> message,
|
||||||
|
|
||||||
Errno Socket::Close() {
|
Errno Socket::Close() {
|
||||||
[[maybe_unused]] const int result = closesocket(fd);
|
[[maybe_unused]] const int result = closesocket(fd);
|
||||||
ASSERT(result == 0);
|
if (result != 0) {
|
||||||
|
LOG_WARNING(Network, "closesocket failed, socket may already be closed");
|
||||||
|
}
|
||||||
fd = INVALID_SOCKET;
|
fd = INVALID_SOCKET;
|
||||||
|
|
||||||
return Errno::SUCCESS;
|
return Errno::SUCCESS;
|
||||||
|
|
|
||||||
|
|
@ -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-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
|
|
@ -48,6 +48,7 @@ enum class Errno {
|
||||||
TIMEDOUT,
|
TIMEDOUT,
|
||||||
MSGSIZE,
|
MSGSIZE,
|
||||||
INPROGRESS,
|
INPROGRESS,
|
||||||
|
ISCONN,
|
||||||
OTHER,
|
OTHER,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue