From e7c2f71cea2f9eb8e6d107baa5908a546de25805 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Mon, 22 Nov 2021 11:39:29 +0100 Subject: [PATCH] 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. --- test/unit/util.c | 2 ++ util.c | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/test/unit/util.c b/test/unit/util.c index 982a0ce..4d7a4e8 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 1f66480..69f523d 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); } /* ================================================== */