]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
staging: panel: fix error path
authorKulikov Vasiliy <segooon@gmail.com>
Fri, 30 Jul 2010 11:08:20 +0000 (15:08 +0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 3 Aug 2010 01:23:45 +0000 (18:23 -0700)
panel_attach() poorly handles errors. On error unregister everything we
have registered.

Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
Acked-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/panel/panel.c

index aeca01c05e402b7e64c7aba93845099f818b66d0..3221814a856ea3b8dab8befa616ab03f50da0fbf 100644 (file)
@@ -2124,12 +2124,18 @@ static void panel_attach(struct parport *port)
                                       NULL,
                                       /*PARPORT_DEV_EXCL */
                                       0, (void *)&pprt);
+       if (pprt == NULL) {
+               pr_err("panel_attach(): port->number=%d parport=%d, "
+                      "parport_register_device() failed\n",
+                      port->number, parport);
+               return;
+       }
 
        if (parport_claim(pprt)) {
                printk(KERN_ERR
                       "Panel: could not claim access to parport%d. "
                       "Aborting.\n", parport);
-               return;
+               goto err_unreg_device;
        }
 
        /* must init LCD first, just in case an IRQ from the keypad is
@@ -2137,13 +2143,23 @@ static void panel_attach(struct parport *port)
         */
        if (lcd_enabled) {
                lcd_init();
-               misc_register(&lcd_dev);
+               if (misc_register(&lcd_dev))
+                       goto err_unreg_device;
        }
 
        if (keypad_enabled) {
                keypad_init();
-               misc_register(&keypad_dev);
+               if (misc_register(&keypad_dev))
+                       goto err_lcd_unreg;
        }
+       return;
+
+err_lcd_unreg:
+       if (lcd_enabled)
+               misc_deregister(&lcd_dev);
+err_unreg_device:
+       parport_unregister_device(pprt);
+       pprt = NULL;
 }
 
 static void panel_detach(struct parport *port)