TTY: pdc_cons, fix open vs pdc_console_tty_driver race
authorJiri Slaby <jslaby@suse.cz>
Mon, 5 Mar 2012 13:52:52 +0000 (14:52 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 8 Mar 2012 20:51:13 +0000 (12:51 -0800)
Assign the pointer to pdc_console_tty_driver (a tty_driver) earlier.
Otherwise the timer may dereference NULL.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Kyle McMartin <kyle@mcmartin.ca>
Cc: Helge Deller <deller@gmx.de>
Cc: "James E.J. Bottomley" <jejb@parisc-linux.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/parisc/kernel/pdc_cons.c

index 8ad05215d4b12e5cb83d8771247568d5b16e2970..d14e20fc60df1df62c283e15f4c93cf67fdd8fb7 100644 (file)
@@ -160,9 +160,7 @@ static void pdc_console_poll(unsigned long unused)
 
 static int __init pdc_console_tty_driver_init(void)
 {
-
        int err;
-       struct tty_driver *drv;
 
        /* Check if the console driver is still registered.
         * It is unregistered if the pdc console was not selected as the
@@ -184,28 +182,27 @@ static int __init pdc_console_tty_driver_init(void)
        printk(KERN_INFO "The PDC console driver is still registered, removing CON_BOOT flag\n");
        pdc_cons.flags &= ~CON_BOOT;
 
-       drv = alloc_tty_driver(1);
+       pdc_console_tty_driver = alloc_tty_driver(1);
 
-       if (!drv)
+       if (!pdc_console_tty_driver)
                return -ENOMEM;
 
-       drv->driver_name = "pdc_cons";
-       drv->name = "ttyB";
-       drv->major = MUX_MAJOR;
-       drv->minor_start = 0;
-       drv->type = TTY_DRIVER_TYPE_SYSTEM;
-       drv->init_termios = tty_std_termios;
-       drv->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS;
-       tty_set_operations(drv, &pdc_console_tty_ops);
-
-       err = tty_register_driver(drv);
+       pdc_console_tty_driver->driver_name = "pdc_cons";
+       pdc_console_tty_driver->name = "ttyB";
+       pdc_console_tty_driver->major = MUX_MAJOR;
+       pdc_console_tty_driver->minor_start = 0;
+       pdc_console_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM;
+       pdc_console_tty_driver->init_termios = tty_std_termios;
+       pdc_console_tty_driver->flags = TTY_DRIVER_REAL_RAW |
+               TTY_DRIVER_RESET_TERMIOS;
+       tty_set_operations(pdc_console_tty_driver, &pdc_console_tty_ops);
+
+       err = tty_register_driver(pdc_console_tty_driver);
        if (err) {
                printk(KERN_ERR "Unable to register the PDC console TTY driver\n");
                return err;
        }
 
-       pdc_console_tty_driver = drv;
-
        return 0;
 }