desktop-shell: don't crash if a surface disappears while grabbed

A surface can get destroyed while a shell grab is active, which can
for example happen if the command running in weston-terminal exits.

When a surface gets destroyed, grab->shsurf is reset to NULL by
destroy_shell_grab_shsurf(), but otherwise the grab remains active and
its callbacks continue to be called. Thus, dereferencing grab->shsurf
in a callback without checking it for NULL first can lead to undefined
behavior, including crashes.

Several functions were already properly checking grab->shsurf for NULL,
move_grab_motion() being one example. Others, however, were not, which
is what this commit fixes.

Related to https://gitlab.freedesktop.org/wayland/weston/issues/192

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
dev
Sergey Bugaev 6 years ago committed by Daniel Stone
parent 15d3d3004b
commit 14ef201295
  1. 5
      desktop-shell/shell.c

@ -3559,8 +3559,7 @@ rotate_grab_motion(struct weston_pointer_grab *grab,
container_of(grab, struct rotate_grab, base.grab); container_of(grab, struct rotate_grab, base.grab);
struct weston_pointer *pointer = grab->pointer; struct weston_pointer *pointer = grab->pointer;
struct shell_surface *shsurf = rotate->base.shsurf; struct shell_surface *shsurf = rotate->base.shsurf;
struct weston_surface *surface = struct weston_surface *surface;
weston_desktop_surface_get_surface(shsurf->desktop_surface);
float cx, cy, dx, dy, cposx, cposy, dposx, dposy, r; float cx, cy, dx, dy, cposx, cposy, dposx, dposy, r;
weston_pointer_move(pointer, event); weston_pointer_move(pointer, event);
@ -3568,6 +3567,8 @@ rotate_grab_motion(struct weston_pointer_grab *grab,
if (!shsurf) if (!shsurf)
return; return;
surface = weston_desktop_surface_get_surface(shsurf->desktop_surface);
cx = 0.5f * surface->width; cx = 0.5f * surface->width;
cy = 0.5f * surface->height; cy = 0.5f * surface->height;

Loading…
Cancel
Save