mirror of
https://gitlab.com/chrony/chrony.git
synced 2025-12-05 05:15:06 -05:00
client: don't call select() with invalid timeout
If the system clock was stepped forward after chronyc sent a request and before it read the clock in order to calculate the receive timeout, select() could be called with a negative timeout, which resulted in an infinite loop waiting for select() to succeed. Fix the submit_request() function to not call select() with a negative timeout. Also, return immediately on any error of select().
This commit is contained in:
10
client.c
10
client.c
@@ -1394,9 +1394,16 @@ submit_request(CMD_Request *request, CMD_Reply *reply)
|
||||
|
||||
timeout = initial_timeout / 1000.0 * (1U << (n_attempts - 1)) -
|
||||
UTI_DiffTimespecsToDouble(&ts_now, &ts_start);
|
||||
UTI_DoubleToTimeval(timeout, &tv);
|
||||
DEBUG_LOG("Timeout %f seconds", timeout);
|
||||
|
||||
/* Avoid calling select() with an invalid timeout */
|
||||
if (timeout <= 0.0) {
|
||||
new_attempt = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
UTI_DoubleToTimeval(timeout, &tv);
|
||||
|
||||
FD_ZERO(&rdfd);
|
||||
FD_ZERO(&wrfd);
|
||||
FD_ZERO(&exfd);
|
||||
@@ -1410,6 +1417,7 @@ submit_request(CMD_Request *request, CMD_Reply *reply)
|
||||
|
||||
if (select_status < 0) {
|
||||
DEBUG_LOG("select failed : %s", strerror(errno));
|
||||
return 0;
|
||||
} else if (select_status == 0) {
|
||||
/* Timeout must have elapsed, try a resend? */
|
||||
new_attempt = 1;
|
||||
|
||||
Reference in New Issue
Block a user