diff --git a/include/ui/pixman-minimal.h b/include/ui/pixman-minimal.h index efcf570c9e..6dd7de1c7e 100644 --- a/include/ui/pixman-minimal.h +++ b/include/ui/pixman-minimal.h @@ -113,6 +113,45 @@ typedef struct pixman_color { uint16_t alpha; } pixman_color_t; +static inline uint32_t *create_bits(pixman_format_code_t format, + int width, + int height, + int *rowstride_bytes) +{ + int stride = 0; + size_t buf_size = 0; + int bpp = PIXMAN_FORMAT_BPP(format); + + /* + * Calculate the following while checking for overflow truncation: + * stride = ((width * bpp + 0x1f) >> 5) * sizeof(uint32_t); + */ + + if (unlikely(__builtin_mul_overflow(width, bpp, &stride))) { + return NULL; + } + + if (unlikely(__builtin_add_overflow(stride, 0x1f, &stride))) { + return NULL; + } + + stride >>= 5; + + stride *= sizeof(uint32_t); + + if (unlikely(__builtin_mul_overflow((size_t) height, + (size_t) stride, + &buf_size))) { + return NULL; + } + + if (rowstride_bytes) { + *rowstride_bytes = stride; + } + + return g_malloc0(buf_size); +} + static inline pixman_image_t *pixman_image_create_bits(pixman_format_code_t format, int width, int height, @@ -123,13 +162,18 @@ static inline pixman_image_t *pixman_image_create_bits(pixman_format_code_t form i->width = width; i->height = height; - i->stride = rowstride_bytes ?: width * DIV_ROUND_UP(PIXMAN_FORMAT_BPP(format), 8); i->format = format; if (bits) { i->data = bits; } else { - i->free_me = i->data = g_malloc0(rowstride_bytes * height); + i->free_me = i->data = + create_bits(format, width, height, &rowstride_bytes); + if (width && height) { + assert(i->data); + } } + i->stride = rowstride_bytes ? rowstride_bytes : + width * DIV_ROUND_UP(PIXMAN_FORMAT_BPP(format), 8); i->ref_count = 1; return i; diff --git a/system/vl.c b/system/vl.c index 5af7ced2a1..da2654aa77 100644 --- a/system/vl.c +++ b/system/vl.c @@ -1110,6 +1110,7 @@ static void parse_display(const char *p) */ if (*opts == '=') { vnc_parse(opts + 1); + display_remote++; } else { error_report("VNC requires a display argument vnc="); exit(1); @@ -1359,6 +1360,7 @@ static void qemu_setup_display(void) dpy.type = DISPLAY_TYPE_NONE; #if defined(CONFIG_VNC) vnc_parse("localhost:0,to=99,id=default"); + display_remote++; #endif } } @@ -1391,7 +1393,7 @@ static void qemu_create_default_devices(void) } } - if (nographic || (!vc && !is_daemonized() && isatty(STDOUT_FILENO))) { + if (nographic) { if (default_parallel) { add_device_config(DEV_PARALLEL, "null"); } diff --git a/ui/console.c b/ui/console.c index 8e688d3569..7db921e3b7 100644 --- a/ui/console.c +++ b/ui/console.c @@ -1679,19 +1679,17 @@ void qemu_display_init(DisplayState *ds, DisplayOptions *opts) const char *qemu_display_get_vc(DisplayOptions *opts) { - assert(opts->type < DISPLAY_TYPE__MAX); - if (opts->type == DISPLAY_TYPE_NONE) { - return NULL; - } - assert(dpys[opts->type] != NULL); - if (dpys[opts->type]->vc) { - return dpys[opts->type]->vc; - } else { #ifdef CONFIG_PIXMAN - return "vc:80Cx24C"; + const char *vc = "vc:80Cx24C"; +#else + const char *vc = NULL; #endif + + assert(opts->type < DISPLAY_TYPE__MAX); + if (dpys[opts->type] && dpys[opts->type]->vc) { + vc = dpys[opts->type]->vc; } - return NULL; + return vc; } void qemu_display_help(void) diff --git a/ui/dbus.c b/ui/dbus.c index 866467ad2e..e08b5de064 100644 --- a/ui/dbus.c +++ b/ui/dbus.c @@ -518,6 +518,7 @@ static QemuDisplay qemu_display_dbus = { .type = DISPLAY_TYPE_DBUS, .early_init = early_dbus_init, .init = dbus_init, + .vc = "vc", }; static void register_dbus(void) diff --git a/ui/gtk.c b/ui/gtk.c index be047a41ad..810d7fc796 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -2534,6 +2534,7 @@ static QemuDisplay qemu_display_gtk = { .type = DISPLAY_TYPE_GTK, .early_init = early_gtk_display_init, .init = gtk_display_init, + .vc = "vc", }; static void register_gtk(void) diff --git a/ui/spice-app.c b/ui/spice-app.c index 405fb7f9f5..a10b4a58fe 100644 --- a/ui/spice-app.c +++ b/ui/spice-app.c @@ -220,6 +220,7 @@ static QemuDisplay qemu_display_spice_app = { .type = DISPLAY_TYPE_SPICE_APP, .early_init = spice_app_display_early_init, .init = spice_app_display_init, + .vc = "vc", }; static void register_spice_app(void)