• Thomas Gleixner's avatar
    sys: Fix missing rcu protection for __task_cred() access · d4581a23
    Thomas Gleixner authored
    commit c69e8d9c (CRED: Use RCU to access another task's creds and to
    release a task's own creds) added non rcu_read_lock() protected access
    to task creds of the target task in set_prio_one().
    
    The comment above the function says:
     * - the caller must hold the RCU read lock
    
    The calling code in sys_setpriority does read_lock(&tasklist_lock) but
    not rcu_read_lock(). This works only when CONFIG_TREE_PREEMPT_RCU=n.
    With CONFIG_TREE_PREEMPT_RCU=y the rcu_callbacks can run in the tick
    interrupt when they see no read side critical section.
    
    There is another instance of __task_cred() in sys_setpriority() itself
    which is equally unprotected.
    
    Wrap the whole code section into a rcu read side critical section to
    fix this quick and dirty.
    
    Will be revisited in course of the read_lock(&tasklist_lock) -> rcu
    crusade.
    
    Oleg noted further:
    
    This also fixes another bug here. find_task_by_vpid() is not safe
    without rcu_read_lock(). I do not mean it is not safe to use the
    result, just find_pid_ns() by itself is not safe.
    
    Usually tasklist gives enough protection, but if copy_process() fails
    it calls free_pid() lockless and does call_rcu(delayed_put_pid().
    This means, without rcu lock find_pid_ns() can't scan the hash table
    safely.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    LKML-Reference: <20091210004703.029784964@linutronix.de>
    Acked-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    d4581a23
sys.c 37.4 KB