shell: fix race on desktop-shell exit

Graphics / Wayland / Weston - Pekka Paalanen [collabora.co.uk] - 28 August 2014 02:15 UTC

The desktop shell plugin registers both a wl_client destroy signal listener, and a sigchld handler, when launching weston-desktop-shell. However, nothing guarantees in which order do the wl_client destructor and the sigchld handler run.

Luckily, the sigchld handler cannot interrupt any code, because we handle the signal via signalfd, which means it is handled like any event in the compositor's main event loop.

Still, shell.c has a race, that when lost, can cause a crash, as described in bug #82957.

If the sigchld handler happens to run first, it will try to launch a new weston-desktop-shell without removing the destroy listener from the old wl_client first. This leads to list corruption, that may cause a crash when the old wl_client gets destroyed.

Simply removing the destroy listener in the sigchld handler is not enough, because respawning sets shell->child.client pointer, and if the wl_client destructor runs after, it will reset it to NULL.

OTOH, the wl_client destroy handler cannot reset shell->child.process, because that would cause the sigchld handler in weston core to not find the process tracker anymore, and report that an unknown process exited.

Turns out, that to make everything work, we would need to wait for both the wl_client destructor and the sigchld handler to have run, before respawn. This gets tricky.

Instead, solve the problem by removing shell->child.process. Use the new weston_client_start() which automatically creates and manages the struct weston_process. The shell does not need to know about the process exit, it only needs to know about the client disconnect. Weston-desktop-shell will never attempt to reconnect, and it would not work even if it did, so disconnect is equivalent to weston-desktop-shell exiting.

This should permanently solve the race for weston-desktop-shell.

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=82957 Cc: Boyan Ding Cc: Derek Foreman

826dc14 shell: fix race on desktop-shell exit
desktop-shell/shell.c | 35 +++++++++++++++++++++--------------
desktop-shell/shell.h | 1 -
2 files changed, 21 insertions(+), 15 deletions(-)

Upstream: cgit.freedesktop.org


  • Share