diff options
Diffstat (limited to 'kernel/posix-timers.c')
-rw-r--r-- | kernel/posix-timers.c | 7 |
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) | |||
462 | static struct pid *good_sigevent(sigevent_t * event) | 462 | static 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); |