• Oleg Nesterov's avatar
    exec:check_unsafe_exec: kill the dead -EAGAIN and clear_in_exec logic · 9e00cdb0
    Oleg Nesterov authored
    fs_struct->in_exec == T means that this ->fs is used by a single process
    (thread group), and one of the treads does do_execve().
    
    To avoid the mt-exec races this code has the following complications:
    
    	1. check_unsafe_exec() returns -EBUSY if ->in_exec was
    	   already set by another thread.
    
    	2. do_execve_common() records "clear_in_exec" to ensure
    	   that the error path can only clear ->in_exec if it was
    	   set by current.
    
    However, after 9b1bf12d "signals: move cred_guard_mutex from
    task_struct to signal_struct" we do not need these complications:
    
    	1. We can't race with our sub-thread, this is called under
    	   per-process ->cred_guard_mutex. And we can't race with
    	   another CLONE_FS task, we already checked that this fs
    	   is not shared.
    
    	   We can remove the  dead -EAGAIN logic.
    
    	2. "out_unmark:" in do_execve_common() is either called
    	   under ->cred_guard_mutex, or after de_thread() which
    	   kills other threads, so we can't race with sub-thread
    	   which could set ->in_exec. And if ->fs is shared with
    	   another process ->in_exec should be false anyway.
    
    	   We can clear in_exec unconditionally.
    
    This also means that check_unsafe_exec() can be void.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Kees Cook <keescook@chromium.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    9e00cdb0
exec.c 37.7 KB