提交 89ee676e 编写于 作者: G Gerd Hoffmann 提交者: Anthony Liguori

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: NGerd Hoffmann <kraxel@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 1063b8b1
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册