Skip to content

Commit

Permalink
Merge tag 'timers-urgent-2024-08-11' of git://git.kernel.org/pub/scm/…
Browse files Browse the repository at this point in the history
…linux/kernel/git/tip/tip

Pull time keeping fixes from Thomas Gleixner:

 - Fix a couple of issues in the NTP code where user supplied values are
   neither sanity checked nor clamped to the operating range. This
   results in integer overflows and eventualy NTP getting out of sync.

   According to the history the sanity checks had been removed in favor
   of clamping the values, but the clamping never worked correctly under
   all circumstances. The NTP people asked to not bring the sanity
   checks back as it might break existing applications.

   Make the clamping work correctly and add it where it's missing

 - If adjtimex() sets the clock it has to trigger the hrtimer subsystem
   so it can adjust and if the clock was set into the future expire
   timers if needed. The caller should provide a bitmask to tell
   hrtimers which clocks have been adjusted.

   adjtimex() uses not the proper constant and uses CLOCK_REALTIME
   instead, which is 0. So hrtimers adjusts only the clocks, but does
   not check for expired timers, which might make them expire really
   late. Use the proper bitmask constant instead.

* tag 'timers-urgent-2024-08-11' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  timekeeping: Fix bogus clock_was_set() invocation in do_adjtimex()
  ntp: Safeguard against time_constant overflow
  ntp: Clamp maxerror and esterror to operating range
  • Loading branch information
torvalds committed Aug 11, 2024
2 parents 56fe0a6 + 5916be8 commit 7270e93
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 6 deletions.
9 changes: 4 additions & 5 deletions kernel/time/ntp.c
Original file line number Diff line number Diff line change
Expand Up @@ -727,17 +727,16 @@ static inline void process_adjtimex_modes(const struct __kernel_timex *txc,
}

if (txc->modes & ADJ_MAXERROR)
time_maxerror = txc->maxerror;
time_maxerror = clamp(txc->maxerror, 0, NTP_PHASE_LIMIT);

if (txc->modes & ADJ_ESTERROR)
time_esterror = txc->esterror;
time_esterror = clamp(txc->esterror, 0, NTP_PHASE_LIMIT);

if (txc->modes & ADJ_TIMECONST) {
time_constant = txc->constant;
time_constant = clamp(txc->constant, 0, MAXTC);
if (!(time_status & STA_NANO))
time_constant += 4;
time_constant = min(time_constant, (long)MAXTC);
time_constant = max(time_constant, 0l);
time_constant = clamp(time_constant, 0, MAXTC);
}

if (txc->modes & ADJ_TAI &&
Expand Down
2 changes: 1 addition & 1 deletion kernel/time/timekeeping.c
Original file line number Diff line number Diff line change
Expand Up @@ -2606,7 +2606,7 @@ int do_adjtimex(struct __kernel_timex *txc)
clock_set |= timekeeping_advance(TK_ADV_FREQ);

if (clock_set)
clock_was_set(CLOCK_REALTIME);
clock_was_set(CLOCK_SET_WALL);

ntp_notify_cmos_timer();

Expand Down

0 comments on commit 7270e93

Please sign in to comment.