server: Disallow sending events to clients after posting an error
authorDerek Foreman <derekf@osg.samsung.com>
Tue, 24 Jan 2017 18:07:20 +0000 (12:07 -0600)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Wed, 25 Jan 2017 12:59:02 +0000 (14:59 +0200)
Until now, we haven't done anything to prevent sending additional
events to clients after posting an error.

Acked-by: Daniel Stone <daniels@collabora.com>
Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
src/wayland-server.c

index a981fda..0a5eacb 100644 (file)
@@ -176,6 +176,9 @@ handle_array(struct wl_resource *resource, uint32_t opcode,
        struct wl_closure *closure;
        struct wl_object *object = &resource->object;
 
+       if (resource->client->error)
+               return;
+
        closure = wl_closure_marshal(object, opcode, args,
                                     &object->interface->events[opcode]);
 
@@ -249,8 +252,6 @@ wl_resource_post_error(struct wl_resource *resource,
        vsnprintf(buffer, sizeof buffer, msg, ap);
        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
@@ -258,11 +259,12 @@ wl_resource_post_error(struct wl_resource *resource,
         * with a NULL display_resource. Do not try to send errors to an
         * already dead client.
         */
-       if (!client->display_resource)
+       if (client->error || !client->display_resource)
                return;
 
        wl_resource_post_event(client->display_resource,
                               WL_DISPLAY_ERROR, resource, code, buffer);
+       client->error = 1;
 }
 
 static int