From be8a6d3cfb4eb0339290c69383f2538af0bb5c6d Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Fri, 23 Sep 2016 09:31:23 +0200 Subject: [PATCH] xdg-shell: validate positioner object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit According to the xdg-shell v6 protocol a positioner object is only complete if both the size and its anchor rectangle are set. Ensure the weston clients do this and let weston be more strict on checking if a client has done so. This also fixes weston-terminal popups not showing up on gnome-shell 3.22. Signed-off-by: Sjoerd Simons Reviewed-by: Jonas Ã…dahl Reviewed-by: Yong Bakos --- clients/window.c | 7 +++++-- libweston-desktop/xdg-shell-v6.c | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/clients/window.c b/clients/window.c index 84d585e5..b987f40d 100644 --- a/clients/window.c +++ b/clients/window.c @@ -5487,13 +5487,14 @@ window_create_menu(struct display *display, static struct zxdg_positioner_v6 * create_simple_positioner(struct display *display, - int x, int y) + int x, int y, int w, int h) { struct zxdg_positioner_v6 *positioner; positioner = zxdg_shell_v6_create_positioner(display->xdg_shell); fail_on_null(positioner, 0, __FILE__, __LINE__); zxdg_positioner_v6_set_anchor_rect(positioner, x, y, 1, 1); + zxdg_positioner_v6_set_size(positioner, w, h); zxdg_positioner_v6_set_anchor(positioner, ZXDG_POSITIONER_V6_ANCHOR_TOP | ZXDG_POSITIONER_V6_ANCHOR_LEFT); @@ -5545,7 +5546,9 @@ window_show_menu(struct display *display, positioner = create_simple_positioner(display, window->x - (ix + parent_geometry.x), - window->y - (iy + parent_geometry.y)); + window->y - (iy + parent_geometry.y), + frame_width(menu->frame), + frame_height(menu->frame)); window->xdg_popup = zxdg_surface_v6_get_popup(window->xdg_surface, parent->xdg_surface, diff --git a/libweston-desktop/xdg-shell-v6.c b/libweston-desktop/xdg-shell-v6.c index 552b3306..edd1dc4a 100644 --- a/libweston-desktop/xdg-shell-v6.c +++ b/libweston-desktop/xdg-shell-v6.c @@ -931,6 +931,15 @@ weston_desktop_xdg_surface_protocol_get_popup(struct wl_client *wl_client, struct weston_desktop_xdg_positioner *positioner = wl_resource_get_user_data(positioner_resource); + /* Checking whether the size and anchor rect both have a positive size + * is enough to verify both have been correctly set */ + if (positioner->size.width == 0 || positioner->anchor_rect.width == 0) { + wl_resource_post_error(resource, + ZXDG_SHELL_V6_ERROR_INVALID_POSITIONER, + "positioner object is not complete"); + return; + } + if (weston_surface_set_role(wsurface, weston_desktop_xdg_popup_role, resource, ZXDG_SHELL_V6_ERROR_ROLE) < 0) return;