Skip to content
  • Oleg Nesterov's avatar
    wait_for_helper: SIGCHLD from user-space can lead to use-after-free · 7d642242
    Oleg Nesterov authored
    
    
    1. wait_for_helper() calls allow_signal(SIGCHLD) to ensure the child
       can't autoreap itself.
    
       However, this means that a spurious SIGCHILD from user-space can
       set TIF_SIGPENDING and:
    
       	- kernel_thread() or sys_wait4() can fail due to signal_pending()
    
       	- worse, wait4() can fail before ____call_usermodehelper() execs
       	  or exits. In this case the caller may kfree(subprocess_info)
       	  while the child still uses this memory.
    
       Change the code to use SIG_DFL instead of magic "(void __user *)2"
       set by allow_signal(). This means that SIGCHLD won't be delivered,
       yet the child won't autoreap itsefl.
    
       The problem is minor, only root can send a signal to this kthread.
    
    2. If sys_wait4(&ret) fails it doesn't populate "ret", in this case
       wait_for_helper() reports a random value from uninitialized var.
    
       With this patch sys_wait4() should never fail, but still it makes
       sense to initialize ret = -ECHILD so that the caller can notice
       the problem.
    
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarNeil Horman <nhorman@tuxdriver.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7d642242