From be4369936bbf1ccf4fdffbbb47d0bbd72f44ae39 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Wed, 21 Apr 2010 17:30:35 +0200 Subject: [PATCH] Clamp tick value before calling adjtimex If tick is outside allowed adjtimex range, clamp it and log a warning instead of aborting. --- sys_linux.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sys_linux.c b/sys_linux.c index 081a036..11cf6a4 100644 --- a/sys_linux.c +++ b/sys_linux.c @@ -566,6 +566,7 @@ static double set_frequency(double freq_ppm) { long required_tick; + long min_allowed_tick, max_allowed_tick; double required_freq; /* what we use */ double scaled_freq; /* what adjtimex & the kernel use */ double old_total_tick; @@ -594,6 +595,18 @@ set_frequency(double freq_ppm) scaled_freq = -freq_scale * required_freq; } + min_allowed_tick = nominal_tick - max_tick_bias + 5; + max_allowed_tick = nominal_tick + max_tick_bias - 5; + + if (required_tick < min_allowed_tick || required_tick > max_allowed_tick) { + LOG(LOGS_WARN, LOGF_SysLinux, "Required tick %ld outside allowed range (%ld .. %ld)", required_tick, min_allowed_tick, max_allowed_tick); + if (required_tick < min_allowed_tick) { + required_tick = min_allowed_tick; + } else { + required_tick = max_allowed_tick; + } + } + current_tick = required_tick; old_total_tick = current_total_tick; current_total_tick = ((double)current_tick + required_freq/dhz) / 1.0e6 ;