summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPekka Paalanen <ppaalanen@gmail.com>2011-11-28 09:47:15 +0200
committerPekka Paalanen <ppaalanen@gmail.com>2011-11-29 14:46:26 +0200
commitab6b0738c67bb6a3eec5b198ff909dc18a562294 (patch)
treefd113f217a95fe6189105cc47e365a0ad02d0024 /src
parenteae3bcb4ccb80ef1c4dcd2f71987c1187aeb9e73 (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>
Diffstat (limited to 'src')
-rw-r--r--src/wayland-server.c19
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,