Commit 15cbfb92 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

posix-cpu-timers: Correctly update timer status in posix_cpu_timer_del()



If posix_cpu_timer_del() exits early due to task not found or sighand
invalid, it fails to clear the state of the timer. That's harmless but
inconsistent.

These early exits are accounted as successful delete. Move the update of
the timer state into the success return path, so all "successful" deletions
are handled.

Reported-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Link: https://lore.kernel.org/all/20241105064212.974053438@linutronix.de
parent c163e40a
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -493,20 +493,20 @@ static int posix_cpu_timer_del(struct k_itimer *timer)
		 */
		WARN_ON_ONCE(ctmr->head || timerqueue_node_queued(&ctmr->node));
	} else {
		if (timer->it.cpu.firing) {
		if (timer->it.cpu.firing)
			ret = TIMER_RETRY;
		} else {
		else
			disarm_timer(timer, p);
			timer->it_status = POSIX_TIMER_DISARMED;
		}
		unlock_task_sighand(p, &flags);
	}

out:
	rcu_read_unlock();
	if (!ret)
		put_pid(ctmr->pid);

	if (!ret) {
		put_pid(ctmr->pid);
		timer->it_status = POSIX_TIMER_DISARMED;
	}
	return ret;
}