summaryrefslogtreecommitdiffstats
path: root/kernel/time
diff options
context:
space:
mode:
authorFrederic Weisbecker <frederic@kernel.org>2021-09-13 16:53:32 +0200
committerThomas Gleixner <tglx@linutronix.de>2021-09-23 11:53:51 +0200
commit8cd9da85d2bd87ce889043e7b1735723dd10eb89 (patch)
tree6c3861d6c7546018bb4bae808aea793a3d95287b /kernel/time
parente4e737bb5c170df6135a127739a9e6148ee3da82 (diff)
downloadlinux-8cd9da85d2bd87ce889043e7b1735723dd10eb89.tar.gz
linux-8cd9da85d2bd87ce889043e7b1735723dd10eb89.tar.bz2
linux-8cd9da85d2bd87ce889043e7b1735723dd10eb89.zip
posix-cpu-timers: Prevent spuriously armed 0-value itimer
Resetting/stopping an itimer eventually leads to it being reprogrammed with an actual "0" value. As a result the itimer expires on the next tick, triggering an unexpected signal. To fix this, make sure that struct signal_struct::it[CPUCLOCK_PROF/VIRT]::expires is set to 0 when setitimer() passes a 0 it_value, indicating that the timer must stop. Fixes: 406dd42bd1ba ("posix-cpu-timers: Force next expiration recalc after itimer reset") Reported-by: Victor Stinner <vstinner@redhat.com> Reported-by: Chris Hixon <linux-kernel-bugs@hixontech.com> Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20210913145332.232023-1-frederic@kernel.org
Diffstat (limited to 'kernel/time')
-rw-r--r--kernel/time/posix-cpu-timers.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index ee736861b18f..643d412ac623 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -1404,7 +1404,8 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clkid,
}
}
- *newval += now;
+ if (*newval)
+ *newval += now;
}
/*