desktop-shell: Fail if get_xdg_surface is called on an xdg_surface
authorJonas Ådahl <jadahl@gmail.com>
Fri, 6 Feb 2015 02:15:28 +0000 (10:15 +0800)
committerBryce Harrington <bryce@osg.samsung.com>
Sat, 7 Feb 2015 01:46:05 +0000 (17:46 -0800)
If a client calls xdg_shell.get_xdg_surface on a surface that is already
an xdg_surface would, prior to this patch, succeed, but cause weston to
crash later when trying to configure. This patch instead sends a role
error to the client complaining that it already is an xdg_surface.

Note that .._set_role() only fails when changing roles, not when setting
the same role twice.

The same is done for xdg_popup.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
desktop-shell/shell.c

index 26cadb6..f28fc10 100644 (file)
@@ -3978,6 +3978,14 @@ xdg_get_xdg_surface(struct wl_client *client,
        struct desktop_shell *shell = sc->shell;
        struct shell_surface *shsurf;
 
+       shsurf = get_shell_surface(surface);
+       if (shsurf && shell_surface_is_xdg_surface(shsurf)) {
+               wl_resource_post_error(resource, XDG_SHELL_ERROR_ROLE,
+                                      "This wl_surface is already an "
+                                      "xdg_surface");
+               return;
+       }
+
        if (weston_surface_set_role(surface, "xdg_surface",
                                    resource, XDG_SHELL_ERROR_ROLE) < 0)
                return;
@@ -4071,6 +4079,14 @@ xdg_get_xdg_popup(struct wl_client *client,
        struct weston_surface *parent;
        struct shell_seat *seat;
 
+       shsurf = get_shell_surface(surface);
+       if (shsurf && shell_surface_is_xdg_popup(shsurf)) {
+               wl_resource_post_error(resource, XDG_SHELL_ERROR_ROLE,
+                                      "This wl_surface is already an "
+                                      "xdg_popup");
+               return;
+       }
+
        if (weston_surface_set_role(surface, "xdg_popup",
                                    resource, XDG_SHELL_ERROR_ROLE) < 0)
                return;