diff options
Diffstat (limited to 'ntpdate/ntpdate.c')
-rw-r--r-- | ntpdate/ntpdate.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/ntpdate/ntpdate.c b/ntpdate/ntpdate.c index a4271605c413..be39cb030edb 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) { |