posix timers: timer_delete: remove the bogus "->it_process != NULL" check
RFC 1/1 posix timers: timer_delete: remove the bogus "->it_process != NULL" check
It is an RFC for sending this patch for stable, when this patch needed, then send ACK and CC stable, if not then send NAK.
---
Quoted 1 line
From
4b7a1304267bff68260ae861784b27130e805be3Mon Sep 17 00:00:00 2001
From: Oleg Nesterov <[email protected]>
Date: Fri, 25 Jul 2008 01:47:26 -0700
Subject: [PATCH] posix timers: timer_delete: remove the bogus "->it_process != NULL" check
[ Upstream commit 4b7a1304267bff68260ae861784b27130e805be3 ]
sys_timer_delete() and itimer_delete() check "timer->it_process != NULL", this looks completely bogus. ->it_process == NULL means that this timer is already under destruction or it is not fully initialized, this must not happen.
sys_timer_delete: the timer is locked, and lock_timer() can't succeed if ->it_process == NULL. itimer_delete: it is called by exit_itimers() when there are no other threads which can play with signal_struct->posix_timers.
Signed-off-by Oleg Nesterov <[email protected]>
Acked-by Roland McGrath <[email protected]>
Cc john stultz <[email protected]>
Cc Thomas Gleixner <[email protected]>
Cc Roland McGrath <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
Signed-off-by Linus Torvalds <[email protected]>
CC Oliver Pinter <[email protected]>
kernel/posix-timers.c +8 -10
@@ -856,11 +856,10 @@ retry_delete:* This keeps any tasks waiting on the spin lock from thinking * they got something (see the lock code above). */ -if (timer->it_process) { -if (timer->it_sigev_notify == (SIGEV_SIGNAL |SIGEV_THREAD_ID )) -put_task_struct (timer->it_process); - timer->it_process =NULL ; - } +if (timer->it_sigev_notify == (SIGEV_SIGNAL |SIGEV_THREAD_ID )) +put_task_struct (timer->it_process); + timer->it_process =NULL ; +unlock_timer (timer, flags);release_posix_timer (timer,IT_ID_SET );return 0 ;
@@ -885,11 +884,10 @@ retry_delete:* This keeps any tasks waiting on the spin lock from thinking * they got something (see the lock code above). */ -if (timer->it_process) { -if (timer->it_sigev_notify == (SIGEV_SIGNAL |SIGEV_THREAD_ID )) -put_task_struct (timer->it_process); - timer->it_process =NULL ; - } +if (timer->it_sigev_notify == (SIGEV_SIGNAL |SIGEV_THREAD_ID )) +put_task_struct (timer->it_process); + timer->it_process =NULL ; +unlock_timer (timer, flags);release_posix_timer (timer,IT_ID_SET ); }