Clamp tick value before calling adjtimex

If tick is outside allowed adjtimex range, clamp it and log a warning
instead of aborting.
This commit is contained in:
Miroslav Lichvar 2010-04-21 17:30:35 +02:00
parent 1a7415a6ab
commit be4369936b

View file

@ -566,6 +566,7 @@ static double
set_frequency(double freq_ppm) set_frequency(double freq_ppm)
{ {
long required_tick; long required_tick;
long min_allowed_tick, max_allowed_tick;
double required_freq; /* what we use */ double required_freq; /* what we use */
double scaled_freq; /* what adjtimex & the kernel use */ double scaled_freq; /* what adjtimex & the kernel use */
double old_total_tick; double old_total_tick;
@ -594,6 +595,18 @@ set_frequency(double freq_ppm)
scaled_freq = -freq_scale * required_freq; 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; current_tick = required_tick;
old_total_tick = current_total_tick; old_total_tick = current_total_tick;
current_total_tick = ((double)current_tick + required_freq/dhz) / 1.0e6 ; current_total_tick = ((double)current_tick + required_freq/dhz) / 1.0e6 ;