Andrew, Could you replace make-good_sigevent-non-static.patch with this patch, as it fixes some problems reported by Oleg Nesterov.
Oleg, chime in if you still see something I missed. Hopefully I will have gotten it right this time. Sorry for the hassle. Sébastien. From: Sébastien Dugué <[EMAIL PROTECTED]> Make good_sigevent() non-static and rename it Move good_sigevent() from posix-timers.c to signal.c where it belongs, clean it up, rename it to sigevent_find_task() to better describe what the function does and make it non-static so that it can be used by other subsystems. include/linux/signal.h | 1 + kernel/posix-timers.c | 19 +------------------ kernel/signal.c | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 18 deletions(-) Signed-off-by: Sébastien Dugué <[EMAIL PROTECTED]> Index: linux-2.6.20-rc6-mm3/include/linux/signal.h =================================================================== --- linux-2.6.20-rc6-mm3.orig/include/linux/signal.h 2007-01-30 11:41:27.000000000 +0100 +++ linux-2.6.20-rc6-mm3/include/linux/signal.h 2007-02-05 12:25:12.000000000 +0100 @@ -240,6 +240,7 @@ extern int sigprocmask(int, sigset_t *, struct pt_regs; extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie); +extern struct task_struct * sigevent_find_task(sigevent_t *); extern struct kmem_cache *sighand_cachep; Index: linux-2.6.20-rc6-mm3/kernel/posix-timers.c =================================================================== --- linux-2.6.20-rc6-mm3.orig/kernel/posix-timers.c 2007-01-30 11:41:27.000000000 +0100 +++ linux-2.6.20-rc6-mm3/kernel/posix-timers.c 2007-01-30 11:41:36.000000000 +0100 @@ -367,23 +367,6 @@ static enum hrtimer_restart posix_timer_ return ret; } -static struct task_struct * good_sigevent(sigevent_t * event) -{ - struct task_struct *rtn = current->group_leader; - - if ((event->sigev_notify & SIGEV_THREAD_ID ) && - (!(rtn = find_task_by_pid(event->sigev_notify_thread_id)) || - rtn->tgid != current->tgid || - (event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_SIGNAL)) - return NULL; - - if (((event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) && - ((event->sigev_signo <= 0) || (event->sigev_signo > SIGRTMAX))) - return NULL; - - return rtn; -} - void register_posix_clock(const clockid_t clock_id, struct k_clock *new_clock) { if ((unsigned) clock_id >= MAX_CLOCKS) { @@ -496,7 +479,7 @@ sys_timer_create(const clockid_t which_c new_timer->it_sigev_value = event.sigev_value; read_lock(&tasklist_lock); - if ((process = good_sigevent(&event))) { + if ((process = sigevent_find_task(&event))) { /* * We may be setting up this process for another * thread. It may be exiting. To catch this Index: linux-2.6.20-rc6-mm3/kernel/signal.c =================================================================== --- linux-2.6.20-rc6-mm3.orig/kernel/signal.c 2007-01-30 11:41:27.000000000 +0100 +++ linux-2.6.20-rc6-mm3/kernel/signal.c 2007-02-05 12:27:33.000000000 +0100 @@ -1213,6 +1213,34 @@ int group_send_sig_info(int sig, struct return ret; } +/*** + * sigevent_find_task - check and get target task from a sigevent. + * @event: the sigevent to be checked + * + * This function must be called with the tasklist_lock held for reading. + */ +struct task_struct * sigevent_find_task(sigevent_t * event) +{ + struct task_struct *task = current->group_leader; + + if ((event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) { + if (event->sigev_signo <= 0 || event->sigev_signo > SIGRTMAX) + return NULL; + } + + if (event->sigev_notify & SIGEV_THREAD_ID) { + if ((event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_SIGNAL) + return NULL; + + task = find_task_by_pid(event->sigev_notify_thread_id); + + if (!task || task->tgid != current->tgid) + task = NULL; + } + + return task; +} + /* * kill_pgrp_info() sends a signal to a process group: this is what the tty * control characters do (^C, ^Z etc) - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/