From 104d6916d0fb61f6a88fded623215d72dae5c901 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 24 Jun 2013 07:23:17 +0200 Subject: [PATCH 17/21] serial: fix error handling RH-Author: Gerd Hoffmann Message-id: <1372058597-15860-3-git-send-email-kraxel@redhat.com> Patchwork-id: 52174 O-Subject: [RHEL-6.5 qemu-kvm PATCH v2 2/2] serial: fix error handling Bugzilla: 872015 RH-Acked-by: Laszlo Ersek RH-Acked-by: Michal Novotny RH-Acked-by: Hans de Goede We have hotpluggable serial devices now, so serial_init_core() must not exit on failure. upstream: fixed as side effect in db895a1e6a97e919f9b86d60c969377357b05066 Signed-off-by: Gerd Hoffmann --- hw/serial.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) Signed-off-by: Miroslav Rezanina --- hw/serial.c | 23 ++++++++++++++++------- 1 files changed, 16 insertions(+), 7 deletions(-) diff --git a/hw/serial.c b/hw/serial.c index 9bdc4d3..2ecc651 100644 --- a/hw/serial.c +++ b/hw/serial.c @@ -720,11 +720,11 @@ static void serial_reset(void *opaque) qemu_irq_lower(s->irq); } -static void serial_init_core(SerialState *s) +static int serial_init_core(SerialState *s) { if (!s->chr) { - fprintf(stderr, "Can't create serial device, empty char device\n"); - exit(1); + error_report("Can't create serial device, empty char device"); + return -1; } s->modem_status_poll = qemu_new_timer(vm_clock, (QEMUTimerCB *) serial_update_msl, s); @@ -736,6 +736,7 @@ static void serial_init_core(SerialState *s) qemu_chr_add_handlers(s->chr, serial_can_receive1, serial_receive1, serial_event, s); + return 0; } static void serial_exit_core(SerialState *s) @@ -772,7 +773,8 @@ static int serial_isa_initfn(ISADevice *dev) s->baudbase = 115200; isa_init_irq(dev, &s->irq, isa->isairq); - serial_init_core(s); + if (serial_init_core(s) < 0) + return -1; vmstate_register(&dev->qdev, isa->iobase, &vmstate_serial, s); register_ioport_write(isa->iobase, 8, 1, serial_ioport_write, s); @@ -803,7 +805,10 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase, s->irq = irq; s->baudbase = baudbase; s->chr = chr; - serial_init_core(s); + if (serial_init_core(s) < 0) { + free(s); + return NULL; + } vmstate_register(NULL, base, &vmstate_serial, s); @@ -898,7 +903,10 @@ SerialState *serial_mm_init (target_phys_addr_t base, int it_shift, s->baudbase = baudbase; s->chr = chr; - serial_init_core(s); + if (serial_init_core(s) < 0) { + qemu_free(s); + return NULL; + } vmstate_register(NULL, base, &vmstate_serial, s); if (ioregister) { @@ -951,7 +959,8 @@ static int serial_pci_init(PCIDevice *dev) SerialState *s = &pci->state; s->baudbase = 115200; - serial_init_core(s); + if (serial_init_core(s) < 0) + return -1; pci_config_set_vendor_id(pci->dev.config, PCI_VENDOR_ID_REDHAT); pci_config_set_device_id(pci->dev.config, PCI_DEVICE_ID_REDHAT_SERIAL); -- 1.7.1