libCom/osi: More NTP time quality checking.
Reject NTP timespec values before the EPICS epoch.
This commit is contained in:
@@ -99,10 +99,12 @@ static void NTPTime_InitOnce(void *pprio)
|
||||
/* Try to sync with NTP server */
|
||||
if (!osdNTPGet(×pecNow)) {
|
||||
NTPTimePvt.syncTick = osdTickGet();
|
||||
epicsTimeFromTimespec(&NTPTimePvt.syncTime, ×pecNow);
|
||||
NTPTimePvt.clockTick = NTPTimePvt.syncTick;
|
||||
NTPTimePvt.clockTime = NTPTimePvt.syncTime;
|
||||
NTPTimePvt.synchronized = 1;
|
||||
if (timespecNow.tv_sec > POSIX_TIME_AT_EPICS_EPOCH && epicsTimeOK ==
|
||||
epicsTimeFromTimespec(&NTPTimePvt.syncTime, ×pecNow)) {
|
||||
NTPTimePvt.clockTick = NTPTimePvt.syncTick;
|
||||
NTPTimePvt.clockTime = NTPTimePvt.syncTime;
|
||||
NTPTimePvt.synchronized = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Start the sync thread */
|
||||
@@ -164,9 +166,14 @@ static void NTPTimeSync(void *dummy)
|
||||
continue;
|
||||
}
|
||||
|
||||
epicsTimeFromTimespec(&timeNow, ×pecNow);
|
||||
ntpDelta = epicsTimeDiffInSeconds(&timeNow, &NTPTimePvt.syncTime);
|
||||
if (timespecNow.tv_sec <= POSIX_TIME_AT_EPICS_EPOCH ||
|
||||
epicsTimeFromTimespec(&timeNow, ×pecNow) == epicsTimeERROR) {
|
||||
errlogPrintf("NTPTimeSync: Bad time received from NTP server\n");
|
||||
NTPTimePvt.synchronized = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
ntpDelta = epicsTimeDiffInSeconds(&timeNow, &NTPTimePvt.syncTime);
|
||||
if (ntpDelta <= 0.0 && NTPTimePvt.synchronized) {
|
||||
errlogPrintf("NTPTimeSync: NTP time not increasing, delta = %g\n",
|
||||
ntpDelta);
|
||||
|
||||
Reference in New Issue
Block a user