spice: fix initialization order
Register displaychangelistener last, after spice is fully initialized,
otherwise we may hit NULL pointer dereferences when qemu starts calling
our callbacks.
Commit e250d949fe triggers this bug.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									365b1e9e34
								
							
						
					
					
						commit
						bdd4df332a
					
				
							
								
								
									
										10
									
								
								hw/qxl.c
								
								
								
								
							
							
						
						
									
										10
									
								
								hw/qxl.c
								
								
								
								
							| 
						 | 
					@ -2049,6 +2049,7 @@ static int qxl_init_primary(PCIDevice *dev)
 | 
				
			||||||
    PCIQXLDevice *qxl = DO_UPCAST(PCIQXLDevice, pci, dev);
 | 
					    PCIQXLDevice *qxl = DO_UPCAST(PCIQXLDevice, pci, dev);
 | 
				
			||||||
    VGACommonState *vga = &qxl->vga;
 | 
					    VGACommonState *vga = &qxl->vga;
 | 
				
			||||||
    PortioList *qxl_vga_port_list = g_new(PortioList, 1);
 | 
					    PortioList *qxl_vga_port_list = g_new(PortioList, 1);
 | 
				
			||||||
 | 
					    int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qxl->id = 0;
 | 
					    qxl->id = 0;
 | 
				
			||||||
    qxl_init_ramsize(qxl);
 | 
					    qxl_init_ramsize(qxl);
 | 
				
			||||||
| 
						 | 
					@ -2063,9 +2064,14 @@ static int qxl_init_primary(PCIDevice *dev)
 | 
				
			||||||
    qemu_spice_display_init_common(&qxl->ssd, vga->ds);
 | 
					    qemu_spice_display_init_common(&qxl->ssd, vga->ds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qxl0 = qxl;
 | 
					    qxl0 = qxl;
 | 
				
			||||||
    register_displaychangelistener(vga->ds, &display_listener);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return qxl_init_common(qxl);
 | 
					    rc = qxl_init_common(qxl);
 | 
				
			||||||
 | 
					    if (rc != 0) {
 | 
				
			||||||
 | 
					        return rc;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    register_displaychangelistener(vga->ds, &display_listener);
 | 
				
			||||||
 | 
					    return rc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int qxl_init_secondary(PCIDevice *dev)
 | 
					static int qxl_init_secondary(PCIDevice *dev)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -573,7 +573,6 @@ void qemu_spice_display_init(DisplayState *ds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    assert(sdpy.ds == NULL);
 | 
					    assert(sdpy.ds == NULL);
 | 
				
			||||||
    qemu_spice_display_init_common(&sdpy, ds);
 | 
					    qemu_spice_display_init_common(&sdpy, ds);
 | 
				
			||||||
    register_displaychangelistener(ds, &display_listener);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sdpy.qxl.base.sif = &dpy_interface.base;
 | 
					    sdpy.qxl.base.sif = &dpy_interface.base;
 | 
				
			||||||
    qemu_spice_add_interface(&sdpy.qxl.base);
 | 
					    qemu_spice_add_interface(&sdpy.qxl.base);
 | 
				
			||||||
| 
						 | 
					@ -581,4 +580,5 @@ void qemu_spice_display_init(DisplayState *ds)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qemu_spice_create_host_memslot(&sdpy);
 | 
					    qemu_spice_create_host_memslot(&sdpy);
 | 
				
			||||||
    qemu_spice_create_host_primary(&sdpy);
 | 
					    qemu_spice_create_host_primary(&sdpy);
 | 
				
			||||||
 | 
					    register_displaychangelistener(ds, &display_listener);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue