From: Miroslav Lichvar Date: Mon, 22 Nov 2021 10:39:29 +0000 (+0100) Subject: ntp: add special value to experimental root delay/disp X-Git-Tag: 4.2-pre1~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7c2f71cea2f9eb8e6d107baa5908a546de25805;p=thirdparty%2Fchrony.git ntp: add special value to experimental root delay/disp The maximum value of the new 32-bit fields is slightly less than 16, which can cause the NTP test #7 to pass for a server which has a zero root delay but maximum root dispersion. Interpret the maximum value as the maximum value of the original 32-bit fields (~65536.0 seconds) for better compatibility with NTPv4. --- diff --git a/test/unit/util.c b/test/unit/util.c index 982a0ce8..4d7a4e8c 100644 --- a/test/unit/util.c +++ b/test/unit/util.c @@ -515,7 +515,9 @@ test_unit(void) TEST_CHECK(UTI_DoubleToNtp32f28(8.0) == htonl(0x80000000)); TEST_CHECK(UTI_DoubleToNtp32f28(16.0) == htonl(0xffffffff)); TEST_CHECK(UTI_DoubleToNtp32f28(16.1) == htonl(0xffffffff)); + TEST_CHECK(UTI_DoubleToNtp32f28(16.1) == htonl(0xffffffff)); + TEST_CHECK(UTI_Ntp32f28ToDouble(htonl(0xffffffff)) >= 65535.999); for (i = 0; i < 100000; i++) { UTI_GetRandomBytes(&ntp32_ts, sizeof (ntp32_ts)); TEST_CHECK(UTI_DoubleToNtp32(UTI_Ntp32ToDouble(ntp32_ts)) == ntp32_ts); diff --git a/util.c b/util.c index 1f664801..69f523d7 100644 --- a/util.c +++ b/util.c @@ -640,7 +640,13 @@ UTI_DoubleToNtp32(double x) double UTI_Ntp32f28ToDouble(NTP_int32 x) { - return ntohl(x) / (double)(1U << 28); + uint32_t r = ntohl(x); + + /* Maximum value is special */ + if (r == 0xffffffff) + return MAX_NTP_INT32; + + return r / (double)(1U << 28); } /* ================================================== */