From 5907b0cc1e1ba60ae15b41e04ae4a217ce2815cd Mon Sep 17 00:00:00 2001 From: Daniel Kobras Date: Mon, 21 Jul 2014 10:47:53 +0200 Subject: [PATCH] sys_poll_intr: fix timeout arithmetic Callers of sys_poll_intr() assume timeout to be in milliseconds like poll(2) expects, but implementation used nanosecond units. Also make sure timeout doesn't become infinite by mistake during time arithmetic. Signed-off-by: Daniel Kobras Reviewed-by: Volker Lendecke Reviewed-by: Stefan Metzmacher Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Tue Jul 22 00:12:24 CEST 2014 on sn-devel-104 --- lib/util/select.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/util/select.c b/lib/util/select.c index 5e66344c9da..99cd772bae8 100644 --- a/lib/util/select.c +++ b/lib/util/select.c @@ -42,9 +42,19 @@ int sys_poll_intr(struct pollfd *fds, int num_fds, int timeout) if (errno != EINTR) { break; } + /* Infinite timeout, no need to adjust. */ + if (timeout < 0) { + continue; + } clock_gettime_mono(&now); - elapsed = nsec_time_diff(&now, &start); - timeout = (orig_timeout - elapsed) / 1000000; + elapsed = nsec_time_diff(&now, &start) / 1000000; + timeout = orig_timeout - elapsed; + /* Unlikely, but might happen eg. when getting traced. + * Make sure we're not hanging in this case. + */ + if (timeout < 0) { + timeout = 0; + } }; return ret; }