[PATCH wayland 2/3] server: Disallow sending events to clients after posting an error

Derek Foreman derekf at osg.samsung.com
Tue Jan 24 18:07:20 UTC 2017


Until now, we haven't done anything to prevent sending additional
events to clients after posting an error.

Acked-by: Daniel Stone <daniels at collabora.com>
Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
---
 src/wayland-server.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/wayland-server.c b/src/wayland-server.c
index 3f252aa..7e26aa0 100644
--- a/src/wayland-server.c
+++ b/src/wayland-server.c
@@ -171,6 +171,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]);
 
@@ -244,8 +247,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
@@ -253,11 +254,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
-- 
2.11.0



More information about the wayland-devel mailing list