From 10f3f5b7f6d1faca62c746d1a4e85f7afba4d7d0 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Fri, 30 Jul 2010 15:08:20 +0400 Subject: staging: panel: fix error path panel_attach() poorly handles errors. On error unregister everything we have registered. Signed-off-by: Kulikov Vasiliy Acked-by: Willy Tarreau Signed-off-by: Greg Kroah-Hartman --- drivers/staging/panel/panel.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/drivers/staging/panel/panel.c b/drivers/staging/panel/panel.c index aeca01c05e4..3221814a856 100644 --- a/drivers/staging/panel/panel.c +++ b/drivers/staging/panel/panel.c @@ -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) -- cgit v1.2.3