Skip to content
  • Роман Донченко's avatar
    Avoid killing all available processes if an X error arrives early on · 3be60637
    Роман Донченко authored
    The timeline of events in dbus-launch's main process goes something like this:
    
    * do initial X calls
    [1]
    * do some other stuff
    * fork
        (child process starts doing some other stuff)
    * return "intermediate parent" pid from fork()
    * obtain bus daemon pid from bus_pid_to_launcher_pipe
    [2]
    * do things that might include X11 calls or killing the dbus-daemon
    
    Meanwhile, the "babysitter" child goes like this:
    
    * return 0 from fork()
    [3]
    * obtain bus daemon pid from parent process via bus_pid_to_babysitter_pipe
    [4]
    * do things that might include X11 calls or killing the bus daemon
    
    Before [1] or [3], the right thing to do about an X error is to just
    exit. The current implementation called kill(-1) first, which is
    undesirable: it kills unrelated processes. With this change, we
    just exit.
    
    After [2] or [4], the right thing to do is to kill the dbus-daemon,
    and that's what the existing code did.
    
    Between [1] and [2], or between [3] and [4], there is no correct thing
    that we can do immediately: we would have to wait for the end of the
    "critical section", *then* kill the dbus-daemon. This has not yet been
    implemented, so this patch relies for its correctness on the fact that
    there are no libX11 calls between those points, so we cannot receive
    an X error between them.
    
    dbus-launch deserves more comments, or a reimplementation that is easier to
    understand, but this change is certainly better than nothing.
    
    [Commit message added, summarizing reviewers' comments -smcv]
    Bug: https://bugs.freedesktop.org/show_bug.cgi?id=74698
    Reviewed-by: Simon McVittie
    Reviewed-by: Thiago Macieira
    3be60637