Skip to content

Commit 7270e93

Browse files
committed
Merge tag 'timers-urgent-2024-08-11' of git://git.kernel.org/pub/scm/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
2 parents 56fe0a6 + 5916be8 commit 7270e93

File tree

2 files changed

+5
-6
lines changed

2 files changed

+5
-6
lines changed

kernel/time/ntp.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -727,17 +727,16 @@ static inline void process_adjtimex_modes(const struct __kernel_timex *txc,
727727
}
728728

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

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

735735
if (txc->modes & ADJ_TIMECONST) {
736-
time_constant = txc->constant;
736+
time_constant = clamp(txc->constant, 0, MAXTC);
737737
if (!(time_status & STA_NANO))
738738
time_constant += 4;
739-
time_constant = min(time_constant, (long)MAXTC);
740-
time_constant = max(time_constant, 0l);
739+
time_constant = clamp(time_constant, 0, MAXTC);
741740
}
742741

743742
if (txc->modes & ADJ_TAI &&

kernel/time/timekeeping.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2606,7 +2606,7 @@ int do_adjtimex(struct __kernel_timex *txc)
26062606
clock_set |= timekeeping_advance(TK_ADV_FREQ);
26072607

26082608
if (clock_set)
2609-
clock_was_set(CLOCK_REALTIME);
2609+
clock_was_set(CLOCK_SET_WALL);
26102610

26112611
ntp_notify_cmos_timer();
26122612

0 commit comments

Comments
 (0)