summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Mader <robert.mader@posteo.de>2020-08-16 22:54:23 +0200
committerRobert Mader <robert.mader@posteo.de>2020-08-26 21:40:27 +0200
commit4839aa6e2eb905537fceba987d07dcd7491299b5 (patch)
tree190733a6d963dda3278a14ae11feeda7fa7f6bf8
parente370ec6f31a7406f677e50c5acc437f247fa14bd (diff)
downloadmutter-4839aa6e2eb905537fceba987d07dcd7491299b5.tar.gz
wayland/xdg-shell: Add parent window validation in get_popup()
Like in most similar places we can not assume to get a valid window when calling `meta_wayland_surface_get_window` as it e.g. might be unmapped already. Calling `get_popup` on an unmapped window is a client bug, thus post a protocol error when this happens. Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/1174 Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/1293 (cherry picked from commit 034c6ab9db2793ad8f8a5f04d46af174c04c9fa0)
-rw-r--r--src/wayland/meta-wayland-xdg-shell.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
index 05577d648..242a1c4ef 100644
--- a/src/wayland/meta-wayland-xdg-shell.c
+++ b/src/wayland/meta-wayland-xdg-shell.c
@@ -1872,6 +1872,15 @@ xdg_surface_constructor_get_popup (struct wl_client *client,
return;
}
+ parent_window = meta_wayland_surface_get_window (parent_surface);
+ if (!parent_window)
+ {
+ wl_resource_post_error (xdg_wm_base_resource,
+ XDG_WM_BASE_ERROR_INVALID_POPUP_PARENT,
+ "Invalid popup parent window");
+ return;
+ }
+
xdg_popup = META_WAYLAND_XDG_POPUP (surface->role);
xdg_popup->resource = wl_resource_create (client,
@@ -1886,8 +1895,6 @@ xdg_surface_constructor_get_popup (struct wl_client *client,
xdg_surface = META_WAYLAND_XDG_SURFACE (xdg_popup);
meta_wayland_xdg_surface_constructor_finalize (constructor, xdg_surface);
- parent_window = meta_wayland_surface_get_window (parent_surface);
-
xdg_positioner = wl_resource_get_user_data (positioner_resource);
xdg_popup->setup.placement_rule =
meta_wayland_xdg_positioner_to_placement (xdg_positioner, parent_window);