From e28dfada8c27f1306ba63f15ff96f8ac96042b5a Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Thu, 12 Jan 2017 13:43:41 +0100 Subject: [PATCH] rtc: check for backward RTC steps When accumulating a new sample, check if the new RTC time is newer the last sample time. If it is not, discard all previous samples, assuming something has stepped the RTC, or it's a broken RTC/driver. --- rtc_linux.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rtc_linux.c b/rtc_linux.c index 8d73102..7394235 100644 --- a/rtc_linux.c +++ b/rtc_linux.c @@ -187,6 +187,11 @@ accumulate_sample(time_t rtc, struct timespec *sys) discard_samples(NEW_FIRST_WHEN_FULL); } + /* Discard all samples if the RTC was stepped back (not our trim) */ + if (n_samples > 0 && rtc_sec[n_samples - 1] - rtc >= rtc_trim[n_samples - 1]) { + DEBUG_LOG(LOGF_RtcLinux, "RTC samples discarded"); + n_samples = 0; + } /* Always use most recent sample as reference */ /* use sample only if n_sample is not negative*/