• Linus Torvalds's avatar
    Make sure "user->sigpending" count is in sync · 10b1fbdb
    Linus Torvalds authored
    The previous commit (45c18b0b, aka "Fix
    unlikely (but possible) race condition on task->user access") fixed a
    potential oops due to __sigqueue_alloc() getting its "user" pointer out
    of sync with switch_user(), and accessing a user pointer that had been
    de-allocated on another CPU.
    
    It still left another (much less serious) problem, where a concurrent
    __sigqueue_alloc and swich_user could cause sigqueue_alloc to do signal
    pending reference counting for a _different_ user than the one it then
    actually ended up using.  No oops, but we'd end up with the wrong signal
    accounting.
    
    Another case of Oleg's eagle-eyes picking up the problem.
    
    This is trivially fixed by just making sure we load whichever "user"
    structure we decide to use (it doesn't matter _which_ one we pick, we
    just need to pick one) just once.
    Acked-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
    Cc: Andrew Morton <akpm@osdl.org>
    Cc: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    10b1fbdb
signal.c 67 KB