From cefdea7d14b57ed7eef12e24d66ea050ea9b730c Mon Sep 17 00:00:00 2001 From: Jakub Krasuski Date: Mon, 5 Oct 2026 21:41:12 +0200 Subject: [PATCH] fix(libkernel): report EINVAL, EACCES, ENOBUFS, ETIMEDOUT and EINTR from Linux sockets The Linux branch of NativeError lacked five codes the Windows branch already translates, so they fell through to EIO. bind on a bound socket and accept on a socket that is not listening set errno to 5 on Linux and to 22 on Windows. Assisted-by: Claude Opus 5.5 --- core/libs/prx/libkernel/Socket/src/Udp.cpp | 5 +++++ core/libs/tests/GuestTcp.cpp | 2 ++ 2 files changed, 7 insertions(+) diff --git a/core/libs/prx/libkernel/Socket/src/Udp.cpp b/core/libs/prx/libkernel/Socket/src/Udp.cpp index 5462087a4..bffca9598 100644 --- a/core/libs/prx/libkernel/Socket/src/Udp.cpp +++ b/core/libs/prx/libkernel/Socket/src/Udp.cpp @@ -57,6 +57,7 @@ int NativeError() { case EAGAIN: return 35; case EADDRINUSE: return 48; case EADDRNOTAVAIL: return 49; + case EACCES: return 13; case EMSGSIZE: return 40; case ENETUNREACH: return 51; case EHOSTUNREACH: return 65; @@ -65,6 +66,10 @@ int NativeError() { case ECONNABORTED: return 53; case EISCONN: return 56; case ENOTCONN: return 57; + case ENOBUFS: return 55; + case ETIMEDOUT: return 60; + case EINTR: return 4; + case EINVAL: return 22; default: return 5; } #endif diff --git a/core/libs/tests/GuestTcp.cpp b/core/libs/tests/GuestTcp.cpp index 2c6927336..0b9b42f2a 100644 --- a/core/libs/tests/GuestTcp.cpp +++ b/core/libs/tests/GuestTcp.cpp @@ -27,6 +27,7 @@ int main() { Require(listener >= 0); std::array address{16, 2, 0, 0, 127, 0, 0, 1}; Require(bind_nid_postfix(listener, address.data(), address.size()) == 0); + Require(bind_nid_postfix(listener, address.data(), address.size()) == -1 && *__error_nid_postfix() == 22); Require(listen_nid_postfix(listener, 4) == 0); std::uint32_t address_size = address.size(); Require(getsockname_nid_postfix(listener, address.data(), &address_size) == 0); @@ -34,6 +35,7 @@ int main() { const int client = socket_nid_postfix(2, 1, 0); Require(client >= 0); + Require(accept_nid_postfix(client, nullptr, nullptr) == -1 && *__error_nid_postfix() == 22); Require(connect_nid_postfix(client, address.data(), address.size()) == 0); std::array peer{}; address_size = peer.size();