Prev: notification updates for 2.6.34-rcX
Next: Tracer Ring Buffer splice() vs page cache [was: Re: Perf and ftrace [was Re: PyTimechart]]
From: Oleg Nesterov on 14 May 2010 15:00 On 05/14, Stanislaw Gruszka wrote: > > On Fri, 14 May 2010 18:03:57 +0200 > Oleg Nesterov <oleg(a)redhat.com> wrote: > > > On 05/14, Andrey Vagin wrote: > > > > > > @@ -613,6 +613,8 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock, > > > * and may cease to exist at any time. Don't use or modify > > > * new_timer after the unlock call. > > > */ > > > +out_cleanup: > > > + CLOCK_DISPATCH(new_timer->it_clock, timer_cleanup, (new_timer)); > > > > But at first glance you are right, posix_cpu_timer_create() does > > get_task_struct(it.cpu.task). > > If I understand problem correctly, seems to be fine to move > CLOCK_DISPATCH(which_clock, timer_create, (new_timer)); > after all possible EFAULT errors and solve leak without creating > new timer_cleanup() callback. I thought about this too, we are doing copy_to_user(created_timer_id) "in advance" anyway. Probably we can move all this code block new_timer->it_id = (timer_t) new_timer_id; new_timer->it_clock = which_clock; new_timer->it_overrun = -1; error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer)); if (error) goto out; down, right before we take ->siglock. But I don't understand the change in posix_cpu_timer_del() from 1/2. Otoh, currently "The next step is hard to back out if there is an error" comment is not right, release_posix_timer() does put_pid(). We can move copy_to_user(created_timer_id) down after "if (timer_event_spec)" block too. (but before CLOCK_DISPATCH(), of course). Andrey, what do you think? Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |