]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
samplefilt: check for non-increasing sample times
authorMiroslav Lichvar <mlichvar@redhat.com>
Thu, 23 Aug 2018 12:19:16 +0000 (14:19 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Fri, 24 Aug 2018 16:09:29 +0000 (18:09 +0200)
Adopt the check from the refclock code to check also samples from NTP.

refclock.c
samplefilt.c
samplefilt.h

index 45fb3abe13ab857a8b18d5372c5e43fdf35d9fbe..66224d5d541beee7455d166b1f0e59c8e410871b 100644 (file)
@@ -372,7 +372,7 @@ convert_tai_offset(struct timespec *sample_time, double *offset)
   return 1;
 }
 
-static void
+static int
 accumulate_sample(RCL_Instance instance, struct timespec *sample_time, double offset, double dispersion)
 {
   NTP_Sample sample;
@@ -391,7 +391,7 @@ accumulate_sample(RCL_Instance instance, struct timespec *sample_time, double of
   else
     sample.stratum = instance->stratum;
 
-  SPF_AccumulateSample(instance->filter, &sample);
+  return SPF_AccumulateSample(instance->filter, &sample);
 }
 
 int
@@ -428,7 +428,10 @@ RCL_AddSample(RCL_Instance instance, struct timespec *sample_time, double offset
     return 0;
   }
 
-  accumulate_sample(instance, &cooked_time, offset - correction + instance->offset, dispersion);
+  if (!accumulate_sample(instance, &cooked_time,
+                         offset - correction + instance->offset, dispersion))
+    return 0;
+
   instance->pps_active = 0;
 
   log_sample(instance, &cooked_time, 0, 0, offset, offset - correction + instance->offset, dispersion);
@@ -570,7 +573,9 @@ RCL_AddCookedPulse(RCL_Instance instance, struct timespec *cooked_time,
       return 0;
   }
 
-  accumulate_sample(instance, cooked_time, offset, dispersion);
+  if (!accumulate_sample(instance, cooked_time, offset, dispersion))
+    return 0;
+
   instance->leap_status = leap;
   instance->pps_active = 1;
 
@@ -599,17 +604,13 @@ RCL_GetDriverPoll(RCL_Instance instance)
 static int
 valid_sample_time(RCL_Instance instance, struct timespec *sample_time)
 {
-  NTP_Sample last_sample;
   struct timespec now;
   double diff;
 
   LCL_ReadCookedTime(&now, NULL);
   diff = UTI_DiffTimespecsToDouble(&now, sample_time);
 
-  if (diff < 0.0 || diff > UTI_Log2ToDouble(instance->poll + 1) ||
-      (SPF_GetNumberOfSamples(instance->filter) > 0 &&
-       SPF_GetLastSample(instance->filter, &last_sample) &&
-       UTI_CompareTimespecs(&last_sample.time, sample_time) >= 0)) {
+  if (diff < 0.0 || diff > UTI_Log2ToDouble(instance->poll + 1)) {
     DEBUG_LOG("%s refclock sample time %s not valid age=%.6f",
               UTI_RefidToString(instance->ref_id),
               UTI_TimespecToString(sample_time), diff);
index af0b34cd5e40ca900fc17be94553b476be4e7287..7226963f60f83ae06eba69fbf8bdf772943637c4 100644 (file)
@@ -102,9 +102,30 @@ SPF_DestroyInstance(SPF_Instance filter)
 
 /* ================================================== */
 
-void
+/* Check that samples times are strictly increasing */
+
+static int
+check_sample(SPF_Instance filter, NTP_Sample *sample)
+{
+  if (filter->used <= 0)
+    return 1;
+
+  if (UTI_CompareTimespecs(&filter->samples[filter->last].time, &sample->time) >= 0) {
+    DEBUG_LOG("filter non-increasing sample time %s", UTI_TimespecToString(&sample->time));
+    return 0;
+  }
+
+  return 1;
+}
+
+/* ================================================== */
+
+int
 SPF_AccumulateSample(SPF_Instance filter, NTP_Sample *sample)
 {
+  if (!check_sample(filter, sample))
+      return 0;
+
   filter->index++;
   filter->index %= filter->max_samples;
   filter->last = filter->index;
@@ -116,6 +137,7 @@ SPF_AccumulateSample(SPF_Instance filter, NTP_Sample *sample)
   DEBUG_LOG("filter sample %d t=%s offset=%.9f peer_disp=%.9f",
             filter->index, UTI_TimespecToString(&sample->time),
             sample->offset, sample->peer_dispersion);
+  return 1;
 }
 
 /* ================================================== */
index 03eb93982a266b549ac19b1bb81314ed7801b7aa..3b4350a3762de7ddc35aa757c844a335aa529e0c 100644 (file)
@@ -36,7 +36,7 @@ extern SPF_Instance SPF_CreateInstance(int min_samples, int max_samples,
                                        double max_dispersion, double combine_ratio);
 extern void SPF_DestroyInstance(SPF_Instance filter);
 
-extern void SPF_AccumulateSample(SPF_Instance filter, NTP_Sample *sample);
+extern int SPF_AccumulateSample(SPF_Instance filter, NTP_Sample *sample);
 extern int SPF_GetLastSample(SPF_Instance filter, NTP_Sample *sample);
 extern int SPF_GetNumberOfSamples(SPF_Instance filter);
 extern double SPF_GetAvgSampleDispersion(SPF_Instance filter);