From 07d4ed95541caa492db3691cddbc4c57d338ce83 Mon Sep 17 00:00:00 2001 From: Juergen Perlinger Date: Tue, 1 Mar 2016 08:30:22 +0100 Subject: [PATCH] [Bug 3023] ntpdate cannot correct dates in the future. bk: 56d5450ekhNG9y81GxG7ZyYK483rXw --- ChangeLog | 1 + ntpdate/ntpdate.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index c70fe8fc56..1eecb8c7aa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * [Bug 2994] Systems with HAVE_SIGNALED_IO fail to compile. perlinger@ntp.org * [Bug 2995] Fixes to compile on Windows +* [Bug 3023] ntpdate cannot correct dates in the future. perlinger@ntp.org --- (4.2.8p6) 2016/01/20 Released by Harlan Stenn diff --git a/ntpdate/ntpdate.c b/ntpdate/ntpdate.c index a4271605c4..be39cb030e 100644 --- a/ntpdate/ntpdate.c +++ b/ntpdate/ntpdate.c @@ -1247,7 +1247,6 @@ static int clock_adjust(void) { register struct server *sp, *server; - s_fp absoffset; int dostep; for (sp = sys_servers; sp != NULL; sp = sp->next_server) @@ -1270,10 +1269,15 @@ clock_adjust(void) } else if (never_step) { dostep = 0; } else { - absoffset = server->soffset; - if (absoffset < 0) - absoffset = -absoffset; - dostep = (absoffset >= NTPDATE_THRESHOLD || absoffset < 0); + /* [Bug 3023] get absolute difference, avoiding signed + * integer overflow like hell. + */ + u_fp absoffset; + if (server->soffset < 0) + absoffset = 1u + (u_fp)(-(server->soffset + 1)); + else + absoffset = (u_fp)server->soffset; + dostep = (absoffset >= NTPDATE_THRESHOLD); } if (dostep) { -- 2.47.3