while client is being destroyed, it destroys all its resources.
Destroy handlers are called for the resources and if some
destroy handler post no memory error, we get crash, because
the display resource is NULL (it is destroyed as a first resource)

Signed-off-by: Marek Chalupa <[email protected]>
---
 tests/client-test.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/tests/client-test.c b/tests/client-test.c
index 2e332f8..cb08e39 100644
--- a/tests/client-test.c
+++ b/tests/client-test.c
@@ -89,3 +89,40 @@ TEST(client_destroy_listener)
        wl_display_destroy(display);
 }
 
+static struct wl_listener seat_destroy_listener;
+
+static void
+seat_destroy_post_no_memory(struct wl_listener *l, void *data)
+{
+       struct wl_resource *resource = data;
+       wl_client_post_no_memory(wl_resource_get_client(resource));
+}
+
+TEST(client_post_nomem_on_destruction)
+{
+       struct wl_display *display;
+       struct wl_client *client;
+       struct wl_resource *resource;
+       int s[2];
+
+       assert(socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, s) == 0);
+       display = wl_display_create();
+       assert(display);
+       client = wl_client_create(display, s[0]);
+       assert(client);
+
+       resource = wl_resource_create(client, &wl_seat_interface,
+                                     wl_seat_interface.version, 0);
+       assert(resource);
+
+       seat_destroy_listener.notify = seat_destroy_post_no_memory;
+       wl_resource_add_destroy_listener(resource, &seat_destroy_listener);
+
+       wl_client_destroy(client);
+
+       close(s[0]);
+       close(s[1]);
+
+       wl_display_destroy(display);
+}
+
-- 
2.5.5

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to