summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--lib/pselect.c6
-rw-r--r--lib/select.c7
3 files changed, 17 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 8d39a64023..587b210323 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2023-04-24 Bruno Haible <bruno@clisp.org>
+
+ select, pselect: Fix test failure on native Windows.
+ * lib/select.c (rpl_select): Fail if nfds is out-of-range.
+ * lib/pselect.c (pselect): Likewise.
+
2023-04-24 Paul Eggert <eggert@cs.ucla.edu>
fclose: pacify gcc -Wanalyzer-file-leak
diff --git a/lib/pselect.c b/lib/pselect.c
index f5d21e1048..52d3837878 100644
--- a/lib/pselect.c
+++ b/lib/pselect.c
@@ -45,6 +45,12 @@ pselect (int nfds, fd_set *restrict rfds,
sigset_t origmask;
struct timeval tv, *tvp;
+ if (nfds < 0 || nfds > FD_SETSIZE)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
if (timeout)
{
if (! (0 <= timeout->tv_nsec && timeout->tv_nsec < 1000000000))
diff --git a/lib/select.c b/lib/select.c
index 3d3efff3de..6b6ca4154c 100644
--- a/lib/select.c
+++ b/lib/select.c
@@ -279,8 +279,11 @@ rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
int i, fd, rc;
clock_t tend;
- if (nfds > FD_SETSIZE)
- nfds = FD_SETSIZE;
+ if (nfds < 0 || nfds > FD_SETSIZE)
+ {
+ errno = EINVAL;
+ return -1;
+ }
if (!timeout)
wait_timeout = INFINITE;