• Oleg Nesterov's avatar
    sched: fix SCHED_FIFO tasks & FAIR_GROUP_SCHED · dae51f56
    Oleg Nesterov authored
    Suppose that the SCHED_FIFO task does
    
    	switch_uid(new_user);
    
    Now, p->se.cfs_rq and p->se.parent both point into the old
    user_struct->tg because sched_move_task() doesn't call set_task_cfs_rq()
    for !fair_sched_class case.
    
    Suppose that old user_struct/task_group is freed/reused, and the task
    does
    
    	sched_setscheduler(SCHED_NORMAL);
    
    __setscheduler() sets fair_sched_class, but doesn't update
    ->se.cfs_rq/parent which point to the freed memory.
    
    This means that check_preempt_wakeup() doing
    
    		while (!is_same_group(se, pse)) {
    			se = parent_entity(se);
    			pse = parent_entity(pse);
    		}
    
    may OOPS in a similar way if rq->curr or p did something like above.
    
    Perhaps we need something like the patch below, note that
    __setscheduler() can't do set_task_cfs_rq().
    Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    dae51f56
sched.c 178 KB