]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
Clamp tick value before calling adjtimex
authorMiroslav Lichvar <mlichvar@redhat.com>
Wed, 21 Apr 2010 15:30:35 +0000 (17:30 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Tue, 27 Apr 2010 12:35:27 +0000 (14:35 +0200)
If tick is outside allowed adjtimex range, clamp it and log a warning
instead of aborting.

sys_linux.c

index 081a036723de71f4bc1e6097d85019918a18a624..11cf6a422009d13b04884a41db21daa4cb54196f 100644 (file)
@@ -566,6 +566,7 @@ static double
 set_frequency(double freq_ppm)
 {
   long required_tick;
+  long min_allowed_tick, max_allowed_tick;
   double required_freq; /* what we use */
   double scaled_freq; /* what adjtimex & the kernel use */
   double old_total_tick;
@@ -594,6 +595,18 @@ set_frequency(double freq_ppm)
     scaled_freq = -freq_scale * required_freq;
   }
 
+  min_allowed_tick = nominal_tick - max_tick_bias + 5;
+  max_allowed_tick = nominal_tick + max_tick_bias - 5;
+
+  if (required_tick < min_allowed_tick || required_tick > max_allowed_tick) {
+    LOG(LOGS_WARN, LOGF_SysLinux, "Required tick %ld outside allowed range (%ld .. %ld)", required_tick, min_allowed_tick, max_allowed_tick);
+    if (required_tick < min_allowed_tick) {
+      required_tick = min_allowed_tick;
+    } else {
+      required_tick = max_allowed_tick;
+    }
+  }
+
   current_tick = required_tick;
   old_total_tick = current_total_tick;
   current_total_tick = ((double)current_tick + required_freq/dhz) / 1.0e6 ;