aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/posix-timers.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/posix-timers.c')
-rw-r--r--kernel/posix-timers.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c
index 495440779ce3..d2818dda736c 100644
--- a/kernel/posix-timers.c
+++ b/kernel/posix-timers.c
@@ -462,6 +462,7 @@ static enum hrtimer_restart posix_timer_fn(struct hrtimer *timer)
462static struct pid *good_sigevent(sigevent_t * event) 462static struct pid *good_sigevent(sigevent_t * event)
463{ 463{
464 struct task_struct *rtn = current->group_leader; 464 struct task_struct *rtn = current->group_leader;
465 int sig = event->sigev_signo;
465 466
466 if ((event->sigev_notify & SIGEV_THREAD_ID ) && 467 if ((event->sigev_notify & SIGEV_THREAD_ID ) &&
467 (!(rtn = find_task_by_vpid(event->sigev_notify_thread_id)) || 468 (!(rtn = find_task_by_vpid(event->sigev_notify_thread_id)) ||
@@ -470,7 +471,8 @@ static struct pid *good_sigevent(sigevent_t * event)
470 return NULL; 471 return NULL;
471 472
472 if (((event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) && 473 if (((event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) &&
473 ((event->sigev_signo <= 0) || (event->sigev_signo > SIGRTMAX))) 474 (sig <= 0 || sig > SIGRTMAX || sig_kernel_only(sig) ||
475 sig_kernel_coredump(sig)))
474 return NULL; 476 return NULL;
475 477
476 return task_pid(rtn); 478 return task_pid(rtn);
@@ -829,6 +831,7 @@ retry:
829 831
830 unlock_timer(timr, flag); 832 unlock_timer(timr, flag);
831 if (error == TIMER_RETRY) { 833 if (error == TIMER_RETRY) {
834 hrtimer_wait_for_timer(&timr->it.real.timer);
832 rtn = NULL; // We already got the old time... 835 rtn = NULL; // We already got the old time...
833 goto retry; 836 goto retry;
834 } 837 }
@@ -867,6 +870,7 @@ retry_delete:
867 870
868 if (timer_delete_hook(timer) == TIMER_RETRY) { 871 if (timer_delete_hook(timer) == TIMER_RETRY) {
869 unlock_timer(timer, flags); 872 unlock_timer(timer, flags);
873 hrtimer_wait_for_timer(&timer->it.real.timer);
870 goto retry_delete; 874 goto retry_delete;
871 } 875 }
872 876
@@ -896,6 +900,7 @@ retry_delete:
896 900
897 if (timer_delete_hook(timer) == TIMER_RETRY) { 901 if (timer_delete_hook(timer) == TIMER_RETRY) {
898 unlock_timer(timer, flags); 902 unlock_timer(timer, flags);
903 hrtimer_wait_for_timer(&timer->it.real.timer);
899 goto retry_delete; 904 goto retry_delete;
900 } 905 }
901 list_del(&timer->list); 906 list_del(&timer->list);