From cf265a8cf3059b34209cdef8afb3b77246614e68 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Tue, 21 May 2019 01:31:35 +0200 Subject: socket: Move initialization of timeval structure into retry loop in socket_check_fd() Depending on the platform, select() may modify the timeval structure to indicate the amount left on the timer, so we reset the timeout before calling select() again. Thanks to sctol for reporting. --- common/socket.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/common/socket.c b/common/socket.c index 1a7fe8d..9ff138b 100644 --- a/common/socket.c +++ b/common/socket.c @@ -365,17 +365,16 @@ int socket_check_fd(int fd, fd_mode fdm, unsigned int timeout) FD_ZERO(&fds); FD_SET(fd, &fds); - if (timeout > 0) { - to.tv_sec = (time_t) (timeout / 1000); - to.tv_usec = (time_t) ((timeout - (to.tv_sec * 1000)) * 1000); - pto = &to; - } else { - pto = NULL; - } - sret = -1; do { + if (timeout > 0) { + to.tv_sec = (time_t) (timeout / 1000); + to.tv_usec = (time_t) ((timeout - (to.tv_sec * 1000)) * 1000); + pto = &to; + } else { + pto = NULL; + } eagain = 0; switch (fdm) { case FDM_READ: -- cgit v1.1-32-gdbae