mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
vnc: fix server surface pixel format.
Format must be identical to the guest surface, we can't work with the 32 bpp used by the default surface allocator. Without this patch vnc doesn't get the conversions right when sending pixel data to the client. The bug triggers if (a) the client doesn't support WMVi, and (b) the guest screen depth is != 32 bpp. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
1063b8b15f
commit
89ee676ead
1 changed files with 9 additions and 12 deletions
21
vnc.c
21
vnc.c
|
@ -366,17 +366,13 @@ static void vnc_resize(VncState *vs)
|
|||
memset(vs->guest.dirty, 0xFF, sizeof(vs->guest.dirty));
|
||||
|
||||
/* server surface */
|
||||
if (!vs->server.ds) {
|
||||
vs->server.ds = default_allocator.create_displaysurface(ds_get_width(ds),
|
||||
ds_get_height(ds));
|
||||
} else {
|
||||
default_allocator.resize_displaysurface(vs->server.ds,
|
||||
ds_get_width(ds), ds_get_height(ds));
|
||||
}
|
||||
if (vs->server.ds->data == NULL) {
|
||||
fprintf(stderr, "vnc: memory allocation failed\n");
|
||||
exit(1);
|
||||
}
|
||||
if (!vs->server.ds)
|
||||
vs->server.ds = qemu_mallocz(sizeof(*vs->server.ds));
|
||||
if (vs->server.ds->data)
|
||||
qemu_free(vs->server.ds->data);
|
||||
*(vs->server.ds) = *(ds->surface);
|
||||
vs->server.ds->data = qemu_mallocz(vs->server.ds->linesize *
|
||||
vs->server.ds->height);
|
||||
memset(vs->server.dirty, 0xFF, sizeof(vs->guest.dirty));
|
||||
}
|
||||
|
||||
|
@ -919,7 +915,8 @@ int vnc_client_io_error(VncState *vs, int ret, int last_errno)
|
|||
if (!vs->vd->clients)
|
||||
dcl->idle = 1;
|
||||
|
||||
default_allocator.free_displaysurface(vs->server.ds);
|
||||
qemu_free(vs->server.ds->data);
|
||||
qemu_free(vs->server.ds);
|
||||
qemu_free(vs->guest.ds);
|
||||
qemu_free(vs);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue