diff mbox

ui: sdl2: Fix crash with -nodefaults -sdl

Message ID 2e555d67b7e53a86bef98f774a2706f2b0ec4ea0.1464728215.git.crobinso@redhat.com
State New
Headers show

Commit Message

Cole Robinson May 31, 2016, 8:56 p.m. UTC
$ ./x86_64-softmmu/qemu-system-x86_64 -nodefaults -sdl
Segmentation fault (core dumped)

0  0x00005555559631af in sdl_display_init (ds=<optimized out>, full_screen=0, no_frame=<optimized out>) at ui/sdl2.c:822
1  0x00005555556c8a9a in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4527

Setting the window icon assumes there's always an SDL output window
available, which isn't the case with when there's no video device,
like via -nodefaults. So don't try to set a window icon when we don't
have any outputs.

https://bugzilla.redhat.com/show_bug.cgi?id=1340931
---
 ui/sdl2.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

-- 
2.5.5

Comments

Peter Maydell May 31, 2016, 9:49 p.m. UTC | #1
On 31 May 2016 at 21:56, Cole Robinson <crobinso@redhat.com> wrote:
> $ ./x86_64-softmmu/qemu-system-x86_64 -nodefaults -sdl

> Segmentation fault (core dumped)

>

> 0  0x00005555559631af in sdl_display_init (ds=<optimized out>, full_screen=0, no_frame=<optimized out>) at ui/sdl2.c:822

> 1  0x00005555556c8a9a in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4527

>

> Setting the window icon assumes there's always an SDL output window

> available, which isn't the case with when there's no video device,

> like via -nodefaults. So don't try to set a window icon when we don't

> have any outputs.


Presumably we also crash for boards like the arm 'virt'
which just don't have a display device at all...

thanks
-- PMM
Cole Robinson June 1, 2016, 11:31 a.m. UTC | #2
On 06/01/2016 02:38 AM, Gerd Hoffmann wrote:
> On Di, 2016-05-31 at 16:56 -0400, Cole Robinson wrote:

>> $ ./x86_64-softmmu/qemu-system-x86_64 -nodefaults -sdl

>> Segmentation fault (core dumped)

>>

>> 0  0x00005555559631af in sdl_display_init (ds=<optimized out>, full_screen=0, no_frame=<optimized out>) at ui/sdl2.c:822

>> 1  0x00005555556c8a9a in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4527

>>

>> Setting the window icon assumes there's always an SDL output window

>> available, which isn't the case with when there's no video device,

>> like via -nodefaults. So don't try to set a window icon when we don't

>> have any outputs.

> 

> Hmm, I guess we can skip pretty much all of the init in case there are

> no outputs:

> 

> @@ -794,6 +794,9 @@ void sdl_display_init(DisplayState *ds, int

> full_screen, int no_frame)

>          }

>      }

>      sdl2_num_outputs = i;

> +    if (sdl2_num_outputs == 0) {

> +        return;

> +    }

>      sdl2_console = g_new0(struct sdl2_console, sdl2_num_outputs);

>      for (i = 0; i < sdl2_num_outputs; i++) {

>          QemuConsole *con = qemu_console_lookup_by_index(i);

> 

> 

> Maybe even move up the loop counting the outputs, so we can skip the

> SDL_Init() call too.  We don't get a empty window then.

> 


Works for me, I figured there was a better approach to handle -sdl + no
display device. If you send a patch I'll test it

Thanks,
Cole
diff mbox

Patch

diff --git a/ui/sdl2.c b/ui/sdl2.c
index 909038f..d0e0a41 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -812,16 +812,18 @@  void sdl_display_init(DisplayState *ds, int full_screen, int no_frame)
         register_displaychangelistener(&sdl2_console[i].dcl);
     }
 
-    /* Load a 32x32x4 image. White pixels are transparent. */
-    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "qemu-icon.bmp");
-    if (filename) {
-        SDL_Surface *image = SDL_LoadBMP(filename);
-        if (image) {
-            uint32_t colorkey = SDL_MapRGB(image->format, 255, 255, 255);
-            SDL_SetColorKey(image, SDL_TRUE, colorkey);
-            SDL_SetWindowIcon(sdl2_console[0].real_window, image);
+    if (sdl2_num_outputs) {
+        /* Load a 32x32x4 image. White pixels are transparent. */
+        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "qemu-icon.bmp");
+        if (filename) {
+            SDL_Surface *image = SDL_LoadBMP(filename);
+            if (image) {
+                uint32_t colorkey = SDL_MapRGB(image->format, 255, 255, 255);
+                SDL_SetColorKey(image, SDL_TRUE, colorkey);
+                SDL_SetWindowIcon(sdl2_console[0].real_window, image);
+            }
+            g_free(filename);
         }
-        g_free(filename);
     }
 
     if (full_screen) {