shell: fix resume_desktop for zero clients
authorPekka Paalanen <ppaalanen@gmail.com>
Fri, 25 Nov 2011 14:07:52 +0000 (16:07 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 2 Dec 2011 11:31:07 +0000 (06:31 -0500)
Fix two bugs:

- if there are no backgrounds at all, the background pointer would have
  been bogus. Lead to a segfault.

- if the hidden_surface_list is empty, wl_list_insert_list() would
  corrupt the list. Lead to a hang in pick_surface().

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
compositor/shell.c

index 7cb7c4e..509d448 100644 (file)
@@ -518,16 +518,23 @@ static void
 resume_desktop(struct wl_shell *shell)
 {
        struct wlsc_surface *surface;
-       struct shell_surface *background;
+       struct wl_list *list;
 
        wl_list_for_each(surface, &shell->hidden_surface_list, link)
                wlsc_surface_configure(surface, surface->x, surface->y,
                                       surface->width, surface->height);
 
-       background = container_of(shell->backgrounds.prev,
-                                 struct shell_surface, link);
-       wl_list_insert_list(background->surface->link.prev,
-                           &shell->hidden_surface_list);
+       if (wl_list_empty(&shell->backgrounds)) {
+               list = &shell->compositor->surface_list;
+       } else {
+               struct shell_surface *background;
+               background = container_of(shell->backgrounds.prev,
+                                         struct shell_surface, link);
+               list = background->surface->link.prev;
+       }
+
+       if (!wl_list_empty(&shell->hidden_surface_list))
+               wl_list_insert_list(list, &shell->hidden_surface_list);
        wl_list_init(&shell->hidden_surface_list);
 
        shell->locked = false;