]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
client: avoid reading clock after sending request
authorMiroslav Lichvar <mlichvar@redhat.com>
Tue, 12 Dec 2017 10:03:04 +0000 (11:03 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Tue, 12 Dec 2017 10:37:36 +0000 (11:37 +0100)
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

index a04dcb84e06ddebcb9b5095a34a3a35f976fbd4e..7d1e3465b3f8f47f46778fafe53ec79cd418706b 100644 (file)
--- 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 */