[Spice-devel] [Spice-commits] 5 commits - client/display_channel.cpp server/red_worker.c server/spice.h

Hans de Goede hdegoede at redhat.com
Fri Sep 7 11:30:08 PDT 2012


Hi,

On 09/07/2012 06:09 PM, Søren Sandmann Pedersen wrote:
>   client/display_channel.cpp |    1 +
>   server/red_worker.c        |   31 +++++++++++++++++++++++++++++++
>   server/spice.h             |    5 ++++-
>   3 files changed, 36 insertions(+), 1 deletion(-)
>
> New commits:
> commit 88283023a89b4ee212ac08ede797d1ce1c3a0906
> Author: Søren Sandmann Pedersen <ssp at redhat.com>
> Date:   Sat Sep 1 11:42:56 2012 -0400
>
>      Bump spice.h version number to 0.11.4
>
>      No new symbols are added, but there is an addition to QXLInterface:
>
>          void (*set_client_capabilities)(QXLInstance *qin,
>                                          uint8_t client_present,
>                                          uint8_t caps[58]);
>

I must admit I've never studied how we do qemu <-> spice ABI
compatibility too closely. But I believe only bumping the server
version is not enough.

This bump will allow qemu to detect compile time it is dealing with
a newer server, but what if we've an old qemu running with the new
server with the above addition to QXLInterface ?

Then the new code will do:

<snip>

> diff --git a/server/red_worker.c b/server/red_worker.c
> index eee9915..1e301c4 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -10344,6 +10344,23 @@ static void handle_new_display_channel(RedWorker *worker, RedClient *client, Red
>       spice_info("jpeg %s", display_channel->enable_jpeg ? "enabled" : "disabled");
>       spice_info("zlib-over-glz %s", display_channel->enable_zlib_glz_wrap ? "enabled" : "disabled");
>
> +    if (worker->qxl->st->qif->set_client_capabilities) {
> +        RedChannelClient *rcc = (RedChannelClient *)dcc;
> +        uint8_t caps[58] = { 0 };
> +
> +#define SET_CAP(a,c)                                                    \
> +        ((a)[(c) / 8] |= (1 << ((c) % 8)))
> +
> +        if (red_channel_client_test_remote_cap(rcc, SPICE_DISPLAY_CAP_SIZED_STREAM))
> +            SET_CAP(caps, SPICE_DISPLAY_CAP_SIZED_STREAM);
> +        if (red_channel_client_test_remote_cap(rcc, SPICE_DISPLAY_CAP_MONITORS_CONFIG))
> +            SET_CAP(caps, SPICE_DISPLAY_CAP_MONITORS_CONFIG);
> +        if (red_channel_client_test_remote_cap(rcc, SPICE_DISPLAY_CAP_COMPOSITE))
> +            SET_CAP(caps, SPICE_DISPLAY_CAP_COMPOSITE);
> +
> +        worker->qxl->st->qif->set_client_capabilities(worker->qxl, TRUE, caps);
> +    }
> +

But this checks for qif->set_client_capabilities, which was not there in the old
QXLInterface struct definition which the old qemu used while compiling, so the check will
point to memory *beyond* the end of the QXLInterface struct (as seen / defined by the older
qemu binary)...

Regards,

Hans


More information about the Spice-devel mailing list