@@ -60,6 +60,30 @@ void NTPClient::begin(int port) {
60
60
this ->_udpSetup = true ;
61
61
}
62
62
63
+ bool NTPClient::isValid (byte * ntpPacket)
64
+ {
65
+ // Perform a few validity checks on the packet
66
+ if ((ntpPacket[0 ] & 0b11000000 ) == 0b11000000 ) // Check for LI=UNSYNC
67
+ return false ;
68
+
69
+ if ((ntpPacket[0 ] & 0b00111000 ) >> 3 < 0b100 ) // Check for Version >= 4
70
+ return false ;
71
+
72
+ if ((ntpPacket[0 ] & 0b00000111 ) != 0b100 ) // Check for Mode == Server
73
+ return false ;
74
+
75
+ if ((ntpPacket[1 ] < 1 ) || (ntpPacket[1 ] > 15 )) // Check for valid Stratum
76
+ return false ;
77
+
78
+ if ( ntpPacket[16 ] == 0 && ntpPacket[17 ] == 0 &&
79
+ ntpPacket[18 ] == 0 && ntpPacket[19 ] == 0 &&
80
+ ntpPacket[20 ] == 0 && ntpPacket[21 ] == 0 &&
81
+ ntpPacket[22 ] == 0 && ntpPacket[22 ] == 0 ) // Check for ReferenceTimestamp != 0
82
+ return false ;
83
+
84
+ return true ;
85
+ }
86
+
63
87
bool NTPClient::forceUpdate () {
64
88
#ifdef DEBUG_NTPClient
65
89
Serial.println (" Update from NTP Server" );
@@ -73,14 +97,20 @@ bool NTPClient::forceUpdate() {
73
97
do {
74
98
delay ( 10 );
75
99
cb = this ->_udp ->parsePacket ();
100
+
101
+ if (cb > 0 )
102
+ {
103
+ this ->_udp ->read (this ->_packetBuffer , NTP_PACKET_SIZE);
104
+ if (!this ->isValid (this ->_packetBuffer ))
105
+ cb = 0 ;
106
+ }
107
+
76
108
if (timeout > 100 ) return false ; // timeout after 1000 ms
77
109
timeout++;
78
110
} while (cb == 0 );
79
111
80
112
this ->_lastUpdate = millis () - (10 * (timeout + 1 )); // Account for delay in reading the time
81
113
82
- this ->_udp ->read (this ->_packetBuffer , NTP_PACKET_SIZE);
83
-
84
114
unsigned long highWord = word (this ->_packetBuffer [40 ], this ->_packetBuffer [41 ]);
85
115
unsigned long lowWord = word (this ->_packetBuffer [42 ], this ->_packetBuffer [43 ]);
86
116
// combine the four bytes (two words) into a long integer
0 commit comments