diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2018-03-08 17:18:03 +0100 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2018-03-12 09:00:59 +0100 |
commit | 2e5567c903ad05d312de0c3188cb2d3b856fa4c4 (patch) | |
tree | 1b6a308596eb1d796a58fcae729f3ac8f58c45b0 /ui/console.c | |
parent | f1bd313264925dfb229a2152eb3f60fe55746b83 (diff) | |
download | qemu-2e5567c903ad05d312de0c3188cb2d3b856fa4c4.zip qemu-2e5567c903ad05d312de0c3188cb2d3b856fa4c4.tar.gz qemu-2e5567c903ad05d312de0c3188cb2d3b856fa4c4.tar.bz2 |
vnc: deal with surface NULL pointers
Secondary displays in multihead setups are allowed to have a NULL
DisplaySurface. Typically user interfaces handle this by hiding the
window which shows the display in question.
This isn't an option for vnc though because it simply hasn't a concept
of windows or outputs. So handle the situation by showing a placeholder
DisplaySurface instead. Also check in console_select whenever a surface
is preset in the first place before requesting an update.
This fixes a segfault which can be triggered by switching to an unused
display (via vtrl-alt-<nr>) in a multihead setup, for example using
-device virtio-vga,max_outputs=2.
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Tested-by: Christian Borntraeger <borntraeger@de.ibm.com>
Message-id: 20180308161803.6152-1-kraxel@redhat.com
Diffstat (limited to 'ui/console.c')
-rw-r--r-- | ui/console.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/ui/console.c b/ui/console.c index 6ab4ff3..348610d 100644 --- a/ui/console.c +++ b/ui/console.c @@ -1039,8 +1039,10 @@ void console_select(unsigned int index) dcl->ops->dpy_gfx_switch(dcl, s->surface); } } - dpy_gfx_update(s, 0, 0, surface_width(s->surface), - surface_height(s->surface)); + if (s->surface) { + dpy_gfx_update(s, 0, 0, surface_width(s->surface), + surface_height(s->surface)); + } } if (ds->have_text) { dpy_text_resize(s, s->width, s->height); @@ -1370,8 +1372,8 @@ DisplaySurface *qemu_create_displaysurface_guestmem(int width, int height, return surface; } -static DisplaySurface *qemu_create_message_surface(int w, int h, - const char *msg) +DisplaySurface *qemu_create_message_surface(int w, int h, + const char *msg) { DisplaySurface *surface = qemu_create_displaysurface(w, h); pixman_color_t bg = color_table_rgb[0][QEMU_COLOR_BLACK]; |