File chrony-gettimeofday.patch of Package chrony.19115
From 6863e43269fe27ce2744eb643295f31c00ec176d Mon Sep 17 00:00:00 2001
From: Miroslav Lichvar <mlichvar@redhat.com>
Date: Tue, 12 Dec 2017 11:03:04 +0100
Subject: [PATCH] client: avoid reading clock after sending request
If chronyc sent a request which caused chronyd to step the clock (e.g.
makestep, settime) and the second reading of the clock before calling
select() to wait for a response happened after the clock was stepped, a
new request could be sent immediately and chronyd would process the same
command twice. If the second request failed (e.g. a settime request too
close to the first request), chronyc would report an error.
Change the submit_request() function to read the clock only once per
select() to wait for the first response even when the clock was stepped.
---
client.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/client.c b/client.c
index a04dcb8..7d1e346 100644
--- a/client.c
+++ b/client.c
@@ -1347,15 +1347,15 @@ submit_request(CMD_Request *request, CMD_Reply *reply)
new_attempt = 1;
do {
+ if (gettimeofday(&tv, NULL))
+ return 0;
+
if (new_attempt) {
new_attempt = 0;
if (n_attempts > max_retries)
return 0;
- if (gettimeofday(&tv, NULL))
- return 0;
-
UTI_TimevalToTimespec(&tv, &ts_start);
UTI_GetRandomBytes(&request->sequence, sizeof (request->sequence));
@@ -1383,9 +1383,6 @@ submit_request(CMD_Request *request, CMD_Reply *reply)
DEBUG_LOG("Sent %d bytes", command_length);
}
- if (gettimeofday(&tv, NULL))
- return 0;
-
UTI_TimevalToTimespec(&tv, &ts_now);
/* Check if the clock wasn't stepped back */
--
2.16.4