Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 692117c1 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

posix-cpu-timers: Sanitize bogus WARNONS



Warning when p == NULL and then proceeding and dereferencing p does not
make any sense as the kernel will crash with a NULL pointer dereference
right away.

Bailing out when p == NULL and returning an error code does not cure the
underlying problem which caused p to be NULL. Though it might allow to
do proper debugging.

Same applies to the clock id check in set_process_cpu_timer().

Clean them up and make them return without trying to do further damage.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Link: https://lkml.kernel.org/r/20190819143801.846497772@linutronix.de
parent 68b2c8c1
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -375,7 +375,8 @@ static int posix_cpu_timer_del(struct k_itimer *timer)
	struct sighand_struct *sighand;
	struct task_struct *p = timer->it.cpu.task;

	WARN_ON_ONCE(p == NULL);
	if (WARN_ON_ONCE(!p))
		return -EINVAL;

	/*
	 * Protect against sighand release/switch in exit/exec and process/
@@ -581,7 +582,8 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,
	u64 old_expires, new_expires, old_incr, val;
	int ret;

	WARN_ON_ONCE(p == NULL);
	if (WARN_ON_ONCE(!p))
		return -EINVAL;

	/*
	 * Use the to_ktime conversion because that clamps the maximum
@@ -716,10 +718,11 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,

static void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec64 *itp)
{
	u64 now;
	struct task_struct *p = timer->it.cpu.task;
	u64 now;

	WARN_ON_ONCE(p == NULL);
	if (WARN_ON_ONCE(!p))
		return;

	/*
	 * Easy part: convert the reload time.
@@ -1001,12 +1004,13 @@ static void check_process_timers(struct task_struct *tsk,
 */
static void posix_cpu_timer_rearm(struct k_itimer *timer)
{
	struct task_struct *p = timer->it.cpu.task;
	struct sighand_struct *sighand;
	unsigned long flags;
	struct task_struct *p = timer->it.cpu.task;
	u64 now;

	WARN_ON_ONCE(p == NULL);
	if (WARN_ON_ONCE(!p))
		return;

	/*
	 * Fetch the current sample and update the timer's expiry time.
@@ -1203,7 +1207,9 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,
	u64 now;
	int ret;

	WARN_ON_ONCE(clock_idx == CPUCLOCK_SCHED);
	if (WARN_ON_ONCE(clock_idx >= CPUCLOCK_SCHED))
		return;

	ret = cpu_timer_sample_group(clock_idx, tsk, &now);

	if (oldval && ret != -EINVAL) {