client: Don't cancel a roundtrip when any event is received
authorJonas Ådahl <jadahl@gmail.com>
Mon, 26 Nov 2012 22:25:53 +0000 (23:25 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 27 Nov 2012 16:09:45 +0000 (11:09 -0500)
Since wl_display_dispatch() returns the number of processed events or -1
on error, only cancel the roundtrip if an -1 is returned.

This also fixes a potential memory corruption bug happening when
wl_display_roundtrip() does an early return and the callback later
writes to the then out of scope stack allocated `done' parameter.

Introduced by 33b7637b4500a682018b503837b8aca9afae36f2.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
src/wayland-client.c

index 5fecc01..5ba2c45 100644 (file)
@@ -649,9 +649,12 @@ wl_display_roundtrip(struct wl_display *display)
        done = 0;
        callback = wl_display_sync(display);
        wl_callback_add_listener(callback, &sync_listener, &done);
-       while (!done && !ret)
+       while (!done && ret >= 0)
                ret = wl_display_dispatch(display);
 
+       if (ret == -1 && !done)
+               wl_callback_destroy(callback);
+
        return ret;
 }