• Guillaume Morin's avatar
    kernel/exit.c: call proc_exit_connector() after exit_state is set · ef982393
    Guillaume Morin authored
    The process events connector delivers a notification when a process
    exits.  This is really convenient for a process that spawns and wants to
    monitor its children through an epoll-able() interface.
    
    Unfortunately, there is a small window between when the event is
    delivered and the child become wait()-able.
    
    This is creates a race if the parent wants to make sure that it knows
    about the exit, e.g
    
    pid_t pid = fork();
    if (pid > 0) {
    	register_interest_for_pid(pid);
    	if (waitpid(pid, NULL, WNOHANG) > 0)
    	{
    	  /* We might have raced with exit() */
    	}
    	return;
    }
    
    /* Child */
    execve(...)
    
    register_interest_for_pid() would be telling the the connector socket
    reader to pay attention to events related to pid.
    
    Though this is not a bug, I think it would make the connector a bit more
    usable if this race was closed by simply moving the call to
    proc_exit_connector() from just before exit_notify() to right after.
    
    Oleg said:
    
    : Even with this patch the code above is still "racy" if the child is
    : multi-threaded.  Plus it should obviously filter-out subthreads.  And
    : afaics there is no way to make it reliable, even if you change the code
    : above so that waitpid() is called only after the last thread exits WNOHANG
    : still can fail.
    Signed-off-by: default avatarGuillaume Morin <guillaume@morinfr.org>
    Cc: Matt Helsley <matt.helsley@gmail.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: David S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ef982393
exit.c 42.6 KB