sys_linux: always call TMX_SetLeap() in set_leap()

The optimization avoiding unnecessary setting of the kernel leap status
can cause a problem when something outside chronyd sets the status to
the new expected value. There will be no TMX_SetLeap() call which would
update the saved status and the kernel status will be overwritten with
the old (incorrect) value in a later TMX_*() call.

Always call TMX_SetLeap() to save the new value and for the log message
selection just check if a leap second has been applied.
This commit is contained in:
Miroslav Lichvar
2015-08-26 14:45:36 +02:00
parent d73394dde1
commit 770db1fe02
3 changed files with 5 additions and 14 deletions

View File

@@ -173,15 +173,13 @@ read_frequency(void)
static void
set_leap(int leap)
{
int current_leap, applied;
int applied;
if (TMX_GetLeap(&current_leap, &applied) < 0) {
applied = 0;
if (!leap && TMX_GetLeapApplied(&applied) < 0) {
LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap");
}
if (current_leap == leap)
return;
if (TMX_SetLeap(leap) < 0) {
LOG_FATAL(LOGF_SysLinux, "adjtimex() failed in set_leap");
}