[PATCH] xwayland: Fix infinite loop on quick movement through menus

Tomasz Borowik timon37 at lavabit.com
Tue Apr 24 13:20:26 PDT 2012


From: timon37 <timon37 at lavabit.com>
Date: Tue, 24 Apr 2012 22:13:38 +0200
Subject: [PATCH] Fix infinite loop in xwl_screen_post_damage

Happens when first two windows are damaged, then later one is damaged and
the other is unrealized. It makes the damaged windows next point to itself.

Triggers most often on menus or tooltips.
---
 hw/xfree86/xwayland/xwayland-window.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c
index e58350f..8db54e1 100644
--- a/hw/xfree86/xwayland/xwayland-window.c
+++ b/hw/xfree86/xwayland/xwayland-window.c
@@ -218,7 +218,7 @@ xwl_unrealize_window(WindowPtr window)
 {
     ScreenPtr screen = window->drawable.pScreen;
     struct xwl_screen *xwl_screen;
-    struct xwl_window *xwl_window;
+    struct xwl_window *xwl_window, *iter, *tmp;
     struct xwl_input_device *xwl_input_device;
     Bool ret;
 
@@ -248,6 +248,14 @@ xwl_unrealize_window(WindowPtr window)
 	wl_buffer_destroy(xwl_window->buffer);
     wl_surface_destroy(xwl_window->surface);
     xorg_list_del(&xwl_window->link);
+    
+    xorg_list_for_each_entry_safe(iter, tmp,
+			     &xwl_screen->damage_window_list, link_damage) {
+	if (iter == xwl_window) {
+	    xorg_list_del(&xwl_window->link_damage);
+	    break;
+	}
+    }
     xorg_list_del(&xwl_window->link_damage);
     DamageUnregister(&window->drawable, xwl_window->damage);
     DamageDestroy(xwl_window->damage);
-- 
1.7.8.5



More information about the wayland-devel mailing list