• M
    futex: futex_find_get_task remove credentails check · 7a0ea09a
    Michal Hocko 提交于
    futex_find_get_task is currently used (through lookup_pi_state) from two
    contexts, futex_requeue and futex_lock_pi_atomic.  None of the paths
    looks it needs the credentials check, though.  Different (e)uids
    shouldn't matter at all because the only thing that is important for
    shared futex is the accessibility of the shared memory.
    
    The credentail check results in glibc assert failure or process hang (if
    glibc is compiled without assert support) for shared robust pthread
    mutex with priority inheritance if a process tries to lock already held
    lock owned by a process with a different euid:
    
    pthread_mutex_lock.c:312: __pthread_mutex_lock_full: Assertion `(-(e)) != 3 || !robust' failed.
    
    The problem is that futex_lock_pi_atomic which is called when we try to
    lock already held lock checks the current holder (tid is stored in the
    futex value) to get the PI state.  It uses lookup_pi_state which in turn
    gets task struct from futex_find_get_task.  ESRCH is returned either
    when the task is not found or if credentials check fails.
    
    futex_lock_pi_atomic simply returns if it gets ESRCH.  glibc code,
    however, doesn't expect that robust lock returns with ESRCH because it
    should get either success or owner died.
    Signed-off-by: NMichal Hocko <mhocko@suse.cz>
    Acked-by: NDarren Hart <dvhltc@us.ibm.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Nick Piggin <npiggin@suse.de>
    Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    7a0ea09a
futex.c 68.1 KB