[Spice-devel] [PATCH] spicec-x11: Fix going into a never ending loop upon xrandr event (#628573)

Hans de Goede hdegoede at redhat.com
Wed Sep 1 11:15:57 PDT 2010


When handling an xrandr event the event_listener->on_monitors_change()
callback destroys and re-creates the monitor object(s) which results
in the DynamicScreen constructor being called, which triggers more
xrandr events. This causes a never ending event handling loop making
spicec hang, and eventually making the X-server crash as a backlog
of events builds up and it oom's.

This patches this by explictly processing the xrandr event caused
by the DynamicScreen constructor inside the constructor surrounded by
the already present guard code against recursive xrandr events.
---
 client/x11/platform.cpp |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
index 8292d44..1f25a7f 100644
--- a/client/x11/platform.cpp
+++ b/client/x11/platform.cpp
@@ -778,6 +778,11 @@ DynamicScreen::DynamicScreen(Display* display, int screen, int& next_mon_id)
     platform_win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, 1, 1, 0, 0, 0);
     XSelectInput(display, platform_win, StructureNotifyMask);
     XRRSelectInput(display, platform_win, RRScreenChangeNotifyMask);
+
+    Monitor::self_monitors_change++;
+    process_monitor_configure_events(platform_win);
+    Monitor::self_monitors_change--;
+
     XPlatform::set_win_proc(platform_win, root_win_proc);
     intern_clipboard_atoms();
     X_DEBUG_SYNC(display);
-- 
1.7.2.2



More information about the Spice-devel mailing list