summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2011-09-16 08:56:38 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2011-09-20 16:12:30 +0200
commitb353c8e04f96b28058b7151d5f71d3bca97feb8c (patch)
treeeb374afdd5cffe41c06aeaad53637f430d63e85f
parentd8e783905425ee5c26420f4d0e54d1905bae6609 (diff)
downloadspice-b353c8e04f96b28058b7151d5f71d3bca97feb8c.tar.gz
spice-b353c8e04f96b28058b7151d5f71d3bca97feb8c.tar.xz
spice-b353c8e04f96b28058b7151d5f71d3bca97feb8c.zip
client: don't crash when booting a Xinerama setup
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
-rw-r--r--client/display_channel.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/client/display_channel.cpp b/client/display_channel.cpp
index 3e43aaed..ea0623ce 100644
--- a/client/display_channel.cpp
+++ b/client/display_channel.cpp
@@ -1162,13 +1162,15 @@ void DisplayChannel::create_canvas(int surface_id, const std::vector<int>& canva
#endif
unsigned int i;
+ if (screen()) {
#ifdef USE_OGL
- 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++) {