1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

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 <d.kobras@science-computing.de>
Reviewed-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>

Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Tue Jul 22 00:12:24 CEST 2014 on sn-devel-104
This commit is contained in:
Daniel Kobras 2014-07-21 10:47:53 +02:00 committed by Jeremy Allison
parent 1dd64341d8
commit 5907b0cc1e

View File

@ -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;
}