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:
parent
1dd64341d8
commit
5907b0cc1e
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user