• Oleg Nesterov's avatar
    [PATCH] posix-timers: fix cleanup_timers() and run_posix_cpu_timers() races · 108150ea
    Oleg Nesterov authored
    1. cleanup_timers() sets timer->task = NULL under tasklist + ->sighand locks.
       That means that this code in posix_cpu_timer_del() and posix_cpu_timer_set()
    
       		lock_timer(timer);
    		if (timer->task == NULL)
    			return;
    		read_lock(tasklist);
    		put_task_struct(timer->task)
    
       is racy. With this patch timer->task modified and accounted only under
       timer->it_lock. Sadly, this means that dead task_struct won't be freed
       until timer deleted or armed.
    
    2. run_posix_cpu_timers() collects expired timers into local list under
       tasklist + ->sighand again. That means that posix_cpu_timer_del()
       should check timer->it.cpu.firing under these locks too.
    Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    108150ea
posix-cpu-timers.c 40.9 KB