mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-16 10:20:30 +00:00
Decrement the timeout being passed to poll() if poll was interrupted for
some reason. This will prevent an infinite loop if (say) a sigalarm is being scheduled at a more frequent interval than the poll timeout. PR: 2191, 8847, 10553
This commit is contained in:
parent
b10e6acec4
commit
6134837824
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=58637
@ -635,11 +635,17 @@ res_send(buf, buflen, ans, anssiz)
|
||||
#ifndef NOPOLL
|
||||
othersyscall:
|
||||
if (use_poll) {
|
||||
struct timeval itv;
|
||||
|
||||
msec = (_res.retrans << try) * 1000;
|
||||
if (try > 0)
|
||||
msec /= _res.nscount;
|
||||
if (msec <= 0)
|
||||
msec = 1000;
|
||||
gettimeofday(&timeout, NULL);
|
||||
itv.tv_sec = msec / 1000;
|
||||
itv.tv_usec = (msec % 1000) * 1000;
|
||||
timeradd(&timeout, &itv, &timeout);
|
||||
} else {
|
||||
#endif
|
||||
timeout.tv_sec = (_res.retrans << try);
|
||||
@ -685,11 +691,22 @@ res_send(buf, buflen, ans, anssiz)
|
||||
} else if (use_poll == 1)
|
||||
use_poll = 2;
|
||||
if (n < 0) {
|
||||
if (errno == EINTR)
|
||||
goto wait;
|
||||
Perror(stderr, "poll", errno);
|
||||
res_close();
|
||||
goto next_ns;
|
||||
if (errno == EINTR) {
|
||||
struct timeval ctv;
|
||||
|
||||
gettimeofday(&ctv, NULL);
|
||||
if (timercmp(&ctv, &timeout, <)) {
|
||||
timersub(&timeout,
|
||||
&ctv, &ctv);
|
||||
msec = ctv.tv_sec * 1000;
|
||||
msec += ctv.tv_usec / 1000;
|
||||
goto wait;
|
||||
}
|
||||
} else {
|
||||
Perror(stderr, "poll", errno);
|
||||
res_close();
|
||||
goto next_ns;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user