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

Hans de Goede hdegoede at redhat.com
Fri Sep 16 01:05:34 PDT 2011


Looks good to me, ACK.

On 09/16/2011 09:58 AM, Christophe Fergeau wrote:
> 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++) {
>


More information about the Spice-devel mailing list