From 66864fcb23012a86827b56b182395d864be7fcd2 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 22 Oct 2010 17:34:13 -0500 Subject: [PATCH] libCom/osi: More NTP time quality checking. Reject NTP timespec values before the EPICS epoch. --- src/libCom/osi/osiNTPTime.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/libCom/osi/osiNTPTime.c b/src/libCom/osi/osiNTPTime.c index a5676d402..d085cca31 100644 --- a/src/libCom/osi/osiNTPTime.c +++ b/src/libCom/osi/osiNTPTime.c @@ -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);