touch-input: Don't dereference NULL pointer during full screen fade
authorDerek Foreman <derekf@osg.samsung.com>
Thu, 4 Sep 2014 15:23:05 +0000 (10:23 -0500)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Fri, 5 Sep 2014 07:32:09 +0000 (10:32 +0300)
If a full screen program is fading out and a touch start happens, it
will result in a NULL pointer dereference when weston_touch_set_focus
tries to derefernce view->surface->resource.

Instead, this patch sets the focus to NULL, which should be the
same as if the program was destroyed during the touch anyway.

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=78706
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
desktop-shell/shell.c
src/input.c

index bf52b93..ad6750d 100644 (file)
@@ -4444,10 +4444,14 @@ fullscreen_binding(struct weston_seat *seat, uint32_t time, uint32_t button, voi
 static void
 touch_move_binding(struct weston_seat *seat, uint32_t time, void *data)
 {
-       struct weston_surface *focus = seat->touch->focus->surface;
+       struct weston_surface *focus;
        struct weston_surface *surface;
        struct shell_surface *shsurf;
 
+       if (seat->touch->focus == NULL)
+               return;
+
+       focus = seat->touch->focus->surface;
        surface = weston_surface_get_main_surface(focus);
        if (surface == NULL)
                return;
index d03333a..5e82f5d 100644 (file)
@@ -1471,8 +1471,14 @@ weston_touch_set_focus(struct weston_seat *seat, struct weston_view *view)
        }
 
        if (view) {
-               struct wl_client *surface_client =
-                       wl_resource_get_client(view->surface->resource);
+               struct wl_client *surface_client;
+
+               if (!view->surface->resource) {
+                       seat->touch->focus = NULL;
+                       return;
+               }
+
+               surface_client = wl_resource_get_client(view->surface->resource);
                move_resources_for_client(focus_resource_list,
                                          &seat->touch->resource_list,
                                          surface_client);