summaryrefslogtreecommitdiff
path: root/src/wayland-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wayland-client.c')
-rw-r--r--src/wayland-client.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/wayland-client.c b/src/wayland-client.c
index 0b988fd..f7ed284 100644
--- a/src/wayland-client.c
+++ b/src/wayland-client.c
@@ -520,7 +520,7 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
struct wl_closure *closure;
struct wl_proxy *proxy;
uint32_t id;
- int opcode;
+ int opcode, ret;
closure = container_of(queue->event_list.next,
struct wl_closure, link);
@@ -528,14 +528,21 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
id = closure->buffer[0];
opcode = closure->buffer[1] & 0xffff;
+ /* Verify that the receiving object is still valid and look up
+ * proxies for any arguments. We have to do this just before
+ * calling the handler, since preceeding events may have
+ * destroyed either the proxy or the proxy args since the
+ * event was queued. */
proxy = wl_map_lookup(&display->objects, id);
+ ret = wl_closure_lookup_objects(closure, &display->objects);
pthread_mutex_unlock(&display->mutex);
- if (proxy != WL_ZOMBIE_OBJECT)
+ if (proxy != WL_ZOMBIE_OBJECT && ret == 0)
wl_closure_invoke(closure, &proxy->object,
proxy->object.implementation[opcode],
proxy->user_data);
+
wl_closure_destroy(closure);
pthread_mutex_lock(&display->mutex);
@@ -546,7 +553,6 @@ WL_EXPORT int
wl_display_dispatch_queue(struct wl_display *display,
struct wl_event_queue *queue)
{
- struct wl_closure *closure;
int len, size;
pthread_mutex_lock(&display->mutex);