summaryrefslogtreecommitdiff
path: root/ntpdate/ntpdate.c
diff options
context:
space:
mode:
Diffstat (limited to 'ntpdate/ntpdate.c')
-rw-r--r--ntpdate/ntpdate.c14
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) {