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 5462087a44..bffca9598c 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 2c69273363..0b9b42f2ad 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();