• Dmitry Adamushko's avatar
    x86-32: Fix endless loop when processing signals for kernel tasks · 29a2e283
    Dmitry Adamushko authored
    The problem occurs on !CONFIG_VM86 kernels [1] when a kernel-mode task
    returns from a system call with a pending signal.
    
    A real-life scenario is a child of 'khelper' returning from a failed
    kernel_execve() in ____call_usermodehelper() [ kernel/kmod.c ].
    kernel_execve() fails due to a pending SIGKILL, which is the result of
    "kill -9 -1" (at least, busybox's init does it upon reboot).
    
    The loop is as follows:
    
    * syscall_exit_work:
     - work_pending:            // start_of_the_loop
     - work_notify_sig:
       - do_notify_resume()
         - do_signal()
           - if (!user_mode(regs)) return;
     - resume_userspace         // TIF_SIGPENDING is still set
     - work_pending             // so we call work_pending => goto
                                // start_of_the_loop
    
    More information can be found in another LKML thread:
    http://www.serverphorums.com/read.php?12,457826
    
    [1] the problem was also seen on MIPS.
    Signed-off-by: default avatarDmitry Adamushko <dmitry.adamushko@gmail.com>
    Link: http://lkml.kernel.org/r/1332448765.2299.68.camel@dimm
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Roland McGrath <roland@hack.frob.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
    29a2e283
entry_32.S 31.7 KB