From 055b968da721ab1c7a7922bc62291e24eac7d00a Mon Sep 17 00:00:00 2001 From: "Daniel K. O. (dkosmari)" Date: Mon, 6 Oct 2025 11:52:41 -0300 Subject: [PATCH 1/2] - Fix select() to also update the fd_set arguments on timeout condition. - Move the nfds argument restriction to the nsysnet side. - Allow user-defined FD_SETSIZE, since newlib's fd_set allow custom sizes. - Define __socklen_t_defined when socklen_t is typedefed. --- include/sys/select.h | 2 ++ include/sys/socket.h | 6 +++++- libraries/wutsocket/select.c | 16 +++++++++------- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/sys/select.h b/include/sys/select.h index e5751c502..38d66cf2f 100644 --- a/include/sys/select.h +++ b/include/sys/select.h @@ -1,5 +1,7 @@ #pragma once +#ifndef FD_SETSIZE #define FD_SETSIZE 32 +#endif #include_next diff --git a/include/sys/socket.h b/include/sys/socket.h index f643851cc..dff7f9a0f 100644 --- a/include/sys/socket.h +++ b/include/sys/socket.h @@ -53,7 +53,11 @@ #define SO_NOSLOWSTART 0x4000 // disable slowstart #define SO_RUSRBUF 0x10000 // enable somemopt provided memory for receive buffer -typedef uint32_t socklen_t; +#ifndef __socklen_t_defined +typedef __socklen_t socklen_t; +#define __socklen_t_defined +#endif + typedef uint16_t sa_family_t; struct sockaddr diff --git a/libraries/wutsocket/select.c b/libraries/wutsocket/select.c index 0623eacff..e85e18b60 100644 --- a/libraries/wutsocket/select.c +++ b/libraries/wutsocket/select.c @@ -11,11 +11,6 @@ select(int nfds, nsysnet_fd_set cnv_rd, cnv_wr, cnv_ex; struct nsysnet_timeval cnv_timeout; - if (nfds > FD_SETSIZE) { - errno = EINVAL; - return -1; - } - NSYSNET_FD_ZERO(&cnv_rd); NSYSNET_FD_ZERO(&cnv_wr); NSYSNET_FD_ZERO(&cnv_ex); @@ -38,6 +33,10 @@ select(int nfds, if ((cnv_fd + 1) > cnv_nfds) { cnv_nfds = cnv_fd + 1; + if (cnv_nfds > NSYSNET_FD_SETSIZE) { + errno = EINVAL; + return -1; + } } if (rd_fd) { @@ -67,8 +66,6 @@ select(int nfds, return rc; } - rc = 0; - if (readfds) { FD_ZERO(readfds); } @@ -79,6 +76,11 @@ select(int nfds, FD_ZERO(exceptfds); } + if (rc == 0) + return 0; + + rc = 0; + for (i = 0; i < nfds; i++) { int cnv_fd = __wut_get_nsysnet_fd(i); if (cnv_fd == -1) { From fa61982981ec7766663405cdfec9446e1f1673d4 Mon Sep 17 00:00:00 2001 From: "Daniel K. O. (dkosmari)" Date: Mon, 6 Oct 2025 12:52:38 -0300 Subject: [PATCH 2/2] Added safety check for poll(): the nsysnet fd must fit in nsysnet_fd_set. --- libraries/wutsocket/poll.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/wutsocket/poll.c b/libraries/wutsocket/poll.c index 27c2672ec..20e88739e 100644 --- a/libraries/wutsocket/poll.c +++ b/libraries/wutsocket/poll.c @@ -32,6 +32,10 @@ poll(struct pollfd *fds, if ((cnv_fd + 1) > cnv_nfds) { cnv_nfds = cnv_fd + 1; + if (cnv_nfds > NSYSNET_FD_SETSIZE) { + errno = EINVAL; + return -1; + } } if (fds[i].events & POLLIN) {