diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2012-11-26 23:25:53 +0100 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-11-27 11:09:45 -0500 |
commit | d7a63fdbfb8fcfcf4b2a81bc4773958ebd785d15 (patch) | |
tree | 7e7964c99b35ebcca4355a36bc96813d68035330 /src/wayland-client.c | |
parent | 5df752ab16f4a343416952ccbc07ab6aa0217429 (diff) |
client: Don't cancel a roundtrip when any event is received
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>
Diffstat (limited to 'src/wayland-client.c')
-rw-r--r-- | src/wayland-client.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/wayland-client.c b/src/wayland-client.c index 5fecc01..5ba2c45 100644 --- a/src/wayland-client.c +++ b/src/wayland-client.c @@ -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; } |