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>
This commit is contained in:
Pekka Paalanen 2011-11-28 09:47:15 +02:00
parent eae3bcb4cc
commit ab6b0738c6

View file

@ -143,6 +143,17 @@ wl_resource_post_error(struct wl_resource *resource,
va_end(ap); va_end(ap);
client->error = 1; 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_resource_post_event(client->display_resource,
WL_DISPLAY_ERROR, resource, code, buffer); WL_DISPLAY_ERROR, resource, code, buffer);
} }
@ -578,6 +589,13 @@ struct wl_display_interface display_interface = {
display_sync, display_sync,
}; };
static void
destroy_client_display_resource(struct wl_resource *resource)
{
resource->client->display_resource = NULL;
free(resource);
}
static void static void
bind_display(struct wl_client *client, bind_display(struct wl_client *client,
void *data, uint32_t version, uint32_t id) void *data, uint32_t version, uint32_t id)
@ -588,6 +606,7 @@ bind_display(struct wl_client *client,
client->display_resource = client->display_resource =
wl_client_add_object(client, &wl_display_interface, wl_client_add_object(client, &wl_display_interface,
&display_interface, id, display); &display_interface, id, display);
client->display_resource->destroy = destroy_client_display_resource;
wl_list_for_each(global, &display->global_list, link) wl_list_for_each(global, &display->global_list, link)
wl_resource_post_event(client->display_resource, wl_resource_post_event(client->display_resource,