Frederic Weisbecker cb87f1
From d897a4ab11dc8a9fda50d2eccc081a96a6385998 Mon Sep 17 00:00:00 2001
Frederic Weisbecker cb87f1
From: Miroslav Lichvar <mlichvar@redhat.com>
Frederic Weisbecker cb87f1
Date: Tue, 18 Jun 2019 17:47:13 +0200
Frederic Weisbecker cb87f1
Subject: [PATCH] ntp: Limit TAI-UTC offset
Frederic Weisbecker cb87f1
Git-commit: d897a4ab11dc8a9fda50d2eccc081a96a6385998
Frederic Weisbecker cb87f1
Patch-mainline: v5.3-rc1
Frederic Weisbecker cb87f1
References: git-fixes
Frederic Weisbecker cb87f1
Frederic Weisbecker cb87f1
Don't allow the TAI-UTC offset of the system clock to be set by adjtimex()
Frederic Weisbecker cb87f1
to a value larger than 100000 seconds.
Frederic Weisbecker cb87f1
Frederic Weisbecker cb87f1
This prevents an overflow in the conversion to int, prevents the CLOCK_TAI
Frederic Weisbecker cb87f1
clock from getting too far ahead of the CLOCK_REALTIME clock, and it is
Frederic Weisbecker cb87f1
still large enough to allow leap seconds to be inserted at the maximum rate
Frederic Weisbecker cb87f1
currently supported by the kernel (once per day) for the next ~270 years,
Frederic Weisbecker cb87f1
however unlikely it is that someone can survive a catastrophic event which
Frederic Weisbecker cb87f1
slowed down the rotation of the Earth so much.
Frederic Weisbecker cb87f1
Frederic Weisbecker cb87f1
Reported-by: Weikang shi <swkhack@gmail.com>
Frederic Weisbecker cb87f1
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
Frederic Weisbecker cb87f1
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Frederic Weisbecker cb87f1
Cc: John Stultz <john.stultz@linaro.org>
Frederic Weisbecker cb87f1
Cc: Prarit Bhargava <prarit@redhat.com>
Frederic Weisbecker cb87f1
Cc: Richard Cochran <richardcochran@gmail.com>
Frederic Weisbecker cb87f1
Cc: Stephen Boyd <sboyd@kernel.org>
Frederic Weisbecker cb87f1
Link: https://lkml.kernel.org/r/20190618154713.20929-1-mlichvar@redhat.com
Frederic Weisbecker cb87f1
Signed-off-by: Frederic Weisbecker <fweisbecker@suse.com>
Frederic Weisbecker cb87f1
---
Frederic Weisbecker cb87f1
 kernel/time/ntp.c | 4 +++-
Frederic Weisbecker cb87f1
 1 file changed, 3 insertions(+), 1 deletion(-)
Frederic Weisbecker cb87f1
Frederic Weisbecker cb87f1
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
Frederic Weisbecker cb87f1
index 8de4f789dc1b..65eb796610dc 100644
Frederic Weisbecker cb87f1
--- a/kernel/time/ntp.c
Frederic Weisbecker cb87f1
+++ b/kernel/time/ntp.c
Frederic Weisbecker cb87f1
@@ -43,6 +43,7 @@ static u64			tick_length_base;
Frederic Weisbecker cb87f1
 #define MAX_TICKADJ		500LL		/* usecs */
Frederic Weisbecker cb87f1
 #define MAX_TICKADJ_SCALED \
Frederic Weisbecker cb87f1
 	(((MAX_TICKADJ * NSEC_PER_USEC) << NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ)
Frederic Weisbecker cb87f1
+#define MAX_TAI_OFFSET		100000
Frederic Weisbecker cb87f1
 
Frederic Weisbecker cb87f1
 /*
Frederic Weisbecker cb87f1
  * phase-lock loop variables
Frederic Weisbecker cb87f1
@@ -691,7 +692,8 @@ static inline void process_adjtimex_modes(const struct __kernel_timex *txc,
Frederic Weisbecker cb87f1
 		time_constant = max(time_constant, 0l);
Frederic Weisbecker cb87f1
 	}
Frederic Weisbecker cb87f1
 
Frederic Weisbecker cb87f1
-	if (txc->modes & ADJ_TAI && txc->constant >= 0)
Frederic Weisbecker cb87f1
+	if (txc->modes & ADJ_TAI &&
Frederic Weisbecker cb87f1
+			txc->constant >= 0 && txc->constant <= MAX_TAI_OFFSET)
Frederic Weisbecker cb87f1
 		*time_tai = txc->constant;
Frederic Weisbecker cb87f1
 
Frederic Weisbecker cb87f1
 	if (txc->modes & ADJ_OFFSET)
Frederic Weisbecker cb87f1
-- 
Frederic Weisbecker cb87f1
2.34.1
Frederic Weisbecker cb87f1