diff options
author | Pekka Paalanen <ppaalanen@gmail.com> | 2011-11-28 09:47:15 +0200 |
---|---|---|
committer | Pekka Paalanen <ppaalanen@gmail.com> | 2011-11-29 14:46:26 +0200 |
commit | ab6b0738c67bb6a3eec5b198ff909dc18a562294 (patch) | |
tree | fd113f217a95fe6189105cc47e365a0ad02d0024 | |
parent | eae3bcb4ccb80ef1c4dcd2f71987c1187aeb9e73 (diff) |
server: no errors to a dead client
Do not try to send errors to an already dead client, while in the
middle of cleanup.
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
-rw-r--r-- | src/wayland-server.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/wayland-server.c b/src/wayland-server.c index 7c93e3f..9358eb4 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -143,6 +143,17 @@ wl_resource_post_error(struct wl_resource *resource, va_end(ap); client->error = 1; + + /* + * When a client aborts, its resources are destroyed in id order, + * which means the display resource is destroyed first. If destruction + * of any later resources results in a protocol error, we end up here + * with a NULL display_resource. Do not try to send errors to an + * already dead client. + */ + if (!client->display_resource) + return; + wl_resource_post_event(client->display_resource, WL_DISPLAY_ERROR, resource, code, buffer); } @@ -579,6 +590,13 @@ struct wl_display_interface display_interface = { }; static void +destroy_client_display_resource(struct wl_resource *resource) +{ + resource->client->display_resource = NULL; + free(resource); +} + +static void bind_display(struct wl_client *client, void *data, uint32_t version, uint32_t id) { @@ -588,6 +606,7 @@ bind_display(struct wl_client *client, client->display_resource = wl_client_add_object(client, &wl_display_interface, &display_interface, id, display); + client->display_resource->destroy = destroy_client_display_resource; wl_list_for_each(global, &display->global_list, link) wl_resource_post_event(client->display_resource, |