shell: Handle the desktop shell client destroy signal

Set the internal pointer for the client to NULL. This fixes a
segmentation fault at shutdown, where the shell would hang up before
and cause libwayland to call wl_client_destroy(). When the shell was
destroyed later, another call to wl_client_destroy() would cause the
crash.

https://bugs.freedesktop.org/show_bug.cgi?id=72550
This commit is contained in:
Ander Conselvan de Oliveira 2013-12-20 21:07:01 +02:00 committed by Kristian Høgsberg
parent 18536764b4
commit 312ea4ca42
2 changed files with 17 additions and 0 deletions

View file

@ -5007,6 +5007,17 @@ desktop_shell_sigchld(struct weston_process *process, int status)
shell_fade_startup(shell);
}
static void
desktop_shell_client_destroy(struct wl_listener *listener, void *data)
{
struct desktop_shell *shell;
shell = container_of(listener, struct desktop_shell,
child.client_destroy_listener);
shell->child.client = NULL;
}
static void
launch_desktop_shell_process(void *data)
{
@ -5019,6 +5030,11 @@ launch_desktop_shell_process(void *data)
if (!shell->child.client)
weston_log("not able to start %s\n", shell->client);
shell->child.client_destroy_listener.notify =
desktop_shell_client_destroy;
wl_client_add_destroy_listener(shell->child.client,
&shell->child.client_destroy_listener);
}
static void

View file

@ -92,6 +92,7 @@ struct desktop_shell {
struct weston_process process;
struct wl_client *client;
struct wl_resource *desktop_shell;
struct wl_listener client_destroy_listener;
unsigned deathcount;
uint32_t deathstamp;