[Spice-devel] [PATCH] client: don't crash when booting a Xinerama setup

Christophe Fergeau cfergeau at redhat.com
Fri Sep 16 00:58:58 PDT 2011


In a Xinerama setup, when X starts up and creates one of the
secondary screens, first a non-primary surface is created on the
secondary screen, and then the primary surface for this screen is
created.
This causes a crash when the guest uses Xinerama and the client
is attached to the VM before X starts (ie while the guest is
booting).
This happens because DisplayChannel::create_canvas (which is called
when creating a non-primary surface) assumes a screen has already been
set for the DisplayChannel while this only happens upon primary surface
creation. However, it uses the screen for non important stuff, so we
can test if screen() is non NULL before using it. This is what is done
in other parts of this file.

Fixes rhbz #732423
---
 client/display_channel.cpp |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/client/display_channel.cpp b/client/display_channel.cpp
index 3b8b91a..5ab7493 100644
--- a/client/display_channel.cpp
+++ b/client/display_channel.cpp
@@ -1165,13 +1165,15 @@ void DisplayChannel::create_canvas(int surface_id, const std::vector<int>& canva
 #endif
     unsigned int i;
 
+    if (screen()) {
 #ifdef USE_OPENGL
-    if (screen()->need_recreate_context_gl()) {
-        recreate = false;
-    }
+        if (screen()->need_recreate_context_gl()) {
+            recreate = false;
+        }
 #endif
 
-    screen()->set_update_interrupt_trigger(NULL);
+        screen()->set_update_interrupt_trigger(NULL);
+    }
 
     for (i = 0; i < canvas_types.size(); i++) {
 
-- 
1.7.6



More information about the Spice-devel mailing list