From 51c67ee61a57093cfd6f0e06a5aff77d479a37e1 Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Thu, 11 Nov 2021 01:20:46 +1300 Subject: Don't allow `fd == -1` to propagate to system calls. --- io.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/io.c b/io.c index 8a4df453ac..366225089c 100644 --- a/io.c +++ b/io.c @@ -11270,9 +11270,12 @@ nogvl_wait_for(VALUE th, rb_io_t *fptr, short events) return RTEST(args.result); } + int fd = fptr->fd; + if (fd == -1) return 0; + struct pollfd fds; - fds.fd = fptr->fd; + fds.fd = fd; fds.events = events; return poll(&fds, 1, -1); @@ -11289,18 +11292,21 @@ nogvl_wait_for(VALUE th, rb_io_t *fptr, short events) return RTEST(args.result); } + int fd = fptr->fd; + if (fd == -1) return 0; + rb_fdset_t fds; int ret; rb_fd_init(&fds); - rb_fd_set(fptr->fd, &fds); + rb_fd_set(fd, &fds); switch (events) { case RB_WAITFD_IN: - ret = rb_fd_select(fptr->fd + 1, &fds, 0, 0, 0); + ret = rb_fd_select(fd + 1, &fds, 0, 0, 0); break; case RB_WAITFD_OUT: - ret = rb_fd_select(fptr->fd + 1, 0, &fds, 0, 0); + ret = rb_fd_select(fd + 1, 0, &fds, 0, 0); break; default: VM_UNREACHABLE(nogvl_wait_for); -- cgit v1.2.3