serial: 8250: Do nothing if nr_uarts=0
authorJan Kiszka <jan.kiszka@siemens.com>
Tue, 5 May 2015 06:26:27 +0000 (08:26 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 10 May 2015 17:10:07 +0000 (19:10 +0200)
When nr_uarts was set to 0 (via config or 8250_core.nr_uarts), we crash
early on x86 because serial8250_isa_init_ports dereferences base_ops
which remains NULL. In fact, there is nothing to do for all the callers
of serial8250_isa_init_ports if there are no uarts.

Based on suggestions by Peter Hurley.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_core.c

index 01cecd52b909dbe9576b64623c674ea8066d4816..5521ff83303f14b5e795fa2c9f30139707de2805 100644 (file)
@@ -3535,6 +3535,9 @@ static struct console univ8250_console = {
 
 static int __init univ8250_console_init(void)
 {
+       if (nr_uarts == 0)
+               return -ENODEV;
+
        serial8250_isa_init_ports();
        register_console(&univ8250_console);
        return 0;
@@ -3565,7 +3568,7 @@ int __init early_serial_setup(struct uart_port *port)
 {
        struct uart_port *p;
 
-       if (port->line >= ARRAY_SIZE(serial8250_ports))
+       if (port->line >= ARRAY_SIZE(serial8250_ports) || nr_uarts == 0)
                return -ENODEV;
 
        serial8250_isa_init_ports();
@@ -3932,6 +3935,9 @@ static int __init serial8250_init(void)
 {
        int ret;
 
+       if (nr_uarts == 0)
+               return -ENODEV;
+
        serial8250_isa_init_ports();
 
        printk(KERN_INFO "Serial: 8250/16550 driver, "