diff --git a/mrbgems/hal-posix-io/src/io_hal.c b/mrbgems/hal-posix-io/src/io_hal.c index bba87ce33..2283fdd7e 100644 --- a/mrbgems/hal-posix-io/src/io_hal.c +++ b/mrbgems/hal-posix-io/src/io_hal.c @@ -519,6 +519,10 @@ void mrb_hal_io_fdset_set(mrb_state *mrb, int fd, mrb_io_fdset *fdset) { (void)mrb; + if (fd < 0 || fd >= FD_SETSIZE) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "fd is out of range"); + return; + } if (fdset) { FD_SET(fd, &fdset->fds); } @@ -528,6 +532,10 @@ int mrb_hal_io_fdset_isset(mrb_state *mrb, int fd, mrb_io_fdset *fdset) { (void)mrb; + if (fd < 0 || fd >= FD_SETSIZE) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "fd is out of range"); + return 0; + } if (fdset) { return FD_ISSET(fd, &fdset->fds); } diff --git a/mrbgems/hal-win-io/src/io_hal.c b/mrbgems/hal-win-io/src/io_hal.c index 9cc3583bd..f3429b62a 100644 --- a/mrbgems/hal-win-io/src/io_hal.c +++ b/mrbgems/hal-win-io/src/io_hal.c @@ -562,6 +562,11 @@ void mrb_hal_io_fdset_set(mrb_state *mrb, int fd, mrb_io_fdset *fdset) { (void)mrb; + if (fdset->fds.fd_count >= FD_SETSIZE) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "too many sockets for fd_set"); + return; + } + if (fdset) { FD_SET(fd, &fdset->fds); }