timesync.cpp fix shift overflow

This commit is contained in:
Verkehrsrot 2019-03-16 22:16:55 +01:00
parent af4cf1d09f
commit 149c7f6732

View File

@ -191,9 +191,15 @@ int recv_timesync_ans(uint8_t buf[], uint8_t buf_len) {
uint16_t timestamp_msec = 4 * buf[5]; // convert 1/250th sec fractions to ms uint16_t timestamp_msec = 4 * buf[5]; // convert 1/250th sec fractions to ms
uint32_t timestamp_sec = 0, tmp_sec = 0; uint32_t timestamp_sec = 0, tmp_sec = 0;
for (uint8_t i = 1; i <= 4; i++) { // get the timeserver time.
timestamp_sec = (tmp_sec <<= 8) |= buf[i]; // The first 4 bytes contain the UTC seconds since unix epoch.
} // Octet order is little endian. Casts are necessary, because buf is an array
// of single byte values, and they might overflow when shifted
timestamp_sec = ((uint32_t)buf[1]) | (((uint32_t)buf[2]) << 8) |
(((uint32_t)buf[3]) << 16) | (((uint32_t)buf[4]) << 24);
// The 5th byte contains the fractional seconds in 2^-8 second steps
timestamp_msec = 4 * buf[5];
if (timestamp_sec + timestamp_msec) // field validation: timestamp not 0 ? if (timestamp_sec + timestamp_msec) // field validation: timestamp not 0 ?
time_sync_rx[k] += seconds(timestamp_sec) + milliseconds(timestamp_msec); time_sync_rx[k] += seconds(timestamp_sec) + milliseconds(timestamp_msec);