desktop-shell: Require a popup parent to be a shell surface
authorDima Ryazanov <dima@gmail.com>
Wed, 8 Apr 2015 18:51:57 +0000 (11:51 -0700)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Mon, 13 Apr 2015 12:23:13 +0000 (15:23 +0300)
Currently, the shell crashes if the parent is not a shell surface. Instead,
send an error to the client.

Signed-off-by: Dima Ryazanov <dima@gmail.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
desktop-shell/shell.c

index f7c928e7873049f39b3cd5f76dffac9f0093acce..96aa8f3729bc929e173bbe1b8c6159b71e30a831 100644 (file)
@@ -3393,7 +3393,8 @@ add_popup_grab(struct shell_surface *shsurf,
        parent = get_shell_surface(shsurf->parent);
        top_surface = get_top_popup(shseat);
        if (shell_surface_is_xdg_popup(shsurf) &&
-           ((top_surface == NULL && !shell_surface_is_xdg_surface(parent)) ||
+           (!parent ||
+            (top_surface == NULL && !shell_surface_is_xdg_surface(parent)) ||
             (top_surface != NULL && parent != top_surface))) {
                wl_resource_post_error(shsurf->owner->resource,
                                       XDG_POPUP_ERROR_NOT_THE_TOPMOST_POPUP,
@@ -4098,13 +4099,14 @@ create_xdg_popup(struct shell_client *owner, void *shell,
 {
        struct shell_surface *shsurf, *parent_shsurf;
 
-       /* Verify that we are creating the top most popup when mapping,
-        * as its not until then we know whether it was mapped as most
+       /* Verify that we are creating the topmost popup when mapping,
+        * as it's not until then we know whether it was mapped as most
         * top level or not. */
 
        parent_shsurf = get_shell_surface(parent);
-       if (!shell_surface_is_xdg_popup(parent_shsurf) &&
-           !shell_surface_is_xdg_surface(parent_shsurf)) {
+       if (!parent_shsurf ||
+           (!shell_surface_is_xdg_popup(parent_shsurf) &&
+            !shell_surface_is_xdg_surface(parent_shsurf))) {
                wl_resource_post_error(owner->resource,
                                       XDG_POPUP_ERROR_INVALID_PARENT,
                                       "xdg_popup parent was invalid");