From: Miroslav Lichvar Date: Tue, 23 Jun 2015 12:48:31 +0000 (+0200) Subject: sys: fix clock stepping by integer number of seconds on Linux X-Git-Tag: 2.1.1~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c2f83bd8a4cdbe6a93b1663741c29e8d65187ed7;p=thirdparty%2Fchrony.git sys: fix clock stepping by integer number of seconds on Linux The kernel requires in the ADJ_SETOFFSET | ADJ_NANO mode that the timex.time.tv_usec value is smaller than 10^9 nanosecond, which wasn't the case with a negative integer offset (e.g. inserted leap second). --- diff --git a/wrap_adjtimex.c b/wrap_adjtimex.c index ef7b0660..50c4ab73 100644 --- a/wrap_adjtimex.c +++ b/wrap_adjtimex.c @@ -193,12 +193,12 @@ TMX_ApplyStepOffset(double offset) struct timex txc; txc.modes = ADJ_SETOFFSET | ADJ_NANO; - if (offset >= 0) { - txc.time.tv_sec = offset; - } else { - txc.time.tv_sec = offset - 1; - } + txc.time.tv_sec = offset; txc.time.tv_usec = 1.0e9 * (offset - txc.time.tv_sec); + if (txc.time.tv_usec < 0) { + txc.time.tv_sec--; + txc.time.tv_usec += 1000000000; + } return adjtimex(&txc); }