diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2016-02-22 13:37:26 +0800 |
---|---|---|
committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2016-02-26 11:55:17 +0200 |
commit | 25fcb88a269a434196cf89df835ba6326bacacab (patch) | |
tree | 2640485f1a68ec344ebb6ae675ae99a98fe56b98 | |
parent | cde251a124d41977b447098cc530fcad2834a45f (diff) | |
download | wayland-25fcb88a269a434196cf89df835ba6326bacacab.tar.gz |
client: Don't segfault when receiving error on destroyed object
If an error is received on a destroyed object, we'd get NULL passed
to display_handle_error() instead of a pointer to a valid wl_proxy.
The logging is changed to report [unknown interface] and [unknown id]
instead of the actual interface name and id.
The wl_display_get_protocol_error() documentation is updated to handle
the situation. For when the proxy was NULL, the object id 0 and
interface NULL is written.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Marek Chalupa <mchqwerty@gmail.com>
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
[Pekka: changed the error message wording]
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Acked-by: Jonas Ådahl <jadahl@gmail.com>
-rw-r--r-- | src/wayland-client.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/wayland-client.c b/src/wayland-client.c index ef12bfc..297c7a5 100644 --- a/src/wayland-client.c +++ b/src/wayland-client.c @@ -177,7 +177,7 @@ display_protocol_error(struct wl_display *display, uint32_t code, return; /* set correct errno */ - if (wl_interface_equal(intf, &wl_display_interface)) { + if (intf && wl_interface_equal(intf, &wl_display_interface)) { switch (code) { case WL_DISPLAY_ERROR_INVALID_OBJECT: case WL_DISPLAY_ERROR_INVALID_METHOD: @@ -790,12 +790,26 @@ display_handle_error(void *data, uint32_t code, const char *message) { struct wl_proxy *proxy = object; + uint32_t object_id; + const struct wl_interface *interface; - wl_log("%s@%u: error %d: %s\n", - proxy->object.interface->name, proxy->object.id, code, message); + if (proxy) { + wl_log("%s@%u: error %d: %s\n", + proxy->object.interface->name, + proxy->object.id, + code, message); - display_protocol_error(display, code, proxy->object.id, - proxy->object.interface); + object_id = proxy->object.id; + interface = proxy->object.interface; + } else { + wl_log("[destroyed object]: error %d: %s\n", + code, message); + + object_id = 0; + interface = NULL; + } + + display_protocol_error(display, code, object_id, interface); } static void @@ -1756,10 +1770,12 @@ wl_display_get_error(struct wl_display *display) /** Retrieves the information about a protocol error: * * \param display The Wayland display - * \param interface if not NULL, stores the interface where the error occurred + * \param interface if not NULL, stores the interface where the error occurred, + * or NULL, if unknown. * \param id if not NULL, stores the object id that generated - * the error. There's no guarantee the object is - * still valid; the client must know if it deleted the object. + * the error, or 0, if the object id is unknown. There's no + * guarantee the object is still valid; the client must know + * if it deleted the object. * \return The error code as defined in the interface specification. * * \code |