Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] applicom: fix error handling

misc_register() can fail.

Signed-off-by: Christophe Lucas <clucas@rotomalug.org>
Signed-off-by: Domen Puncer <domen@coderock.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Christophe Lucas and committed by
Linus Torvalds
819a3eba 5ce7852c

+20 -4
+20 -4
drivers/char/applicom.c
··· 172 172 173 173 void cleanup_module(void) 174 174 { 175 - int i; 175 + unsigned int i; 176 176 177 177 misc_deregister(&ac_miscdev); 178 178 ··· 195 195 int i, numisa = 0; 196 196 struct pci_dev *dev = NULL; 197 197 void __iomem *RamIO; 198 - int boardno; 198 + int boardno, ret; 199 199 200 200 printk(KERN_INFO "Applicom driver: $Id: ac.c,v 1.30 2000/03/22 16:03:57 dwmw2 Exp $\n"); 201 201 ··· 294 294 } 295 295 296 296 if (!numisa) 297 - printk(KERN_WARNING"ac.o: No valid ISA Applicom boards found at mem 0x%lx\n",mem); 297 + printk(KERN_WARNING "ac.o: No valid ISA Applicom boards found " 298 + "at mem 0x%lx\n", mem); 298 299 299 300 fin: 300 301 init_waitqueue_head(&FlagSleepRec); ··· 305 304 DeviceErrorCount = 0; 306 305 307 306 if (numboards) { 308 - misc_register(&ac_miscdev); 307 + ret = misc_register(&ac_miscdev); 308 + if (ret) { 309 + printk(KERN_WARNING "ac.o: Unable to register misc device\n"); 310 + goto out; 311 + } 309 312 for (i = 0; i < MAX_BOARD; i++) { 310 313 int serial; 311 314 char boardname[(SERIAL_NUMBER - TYPE_CARD) + 1]; ··· 342 337 343 338 else 344 339 return -ENXIO; 340 + 341 + out: 342 + for (i = 0; i < MAX_BOARD; i++) { 343 + if (!apbs[i].RamIO) 344 + continue; 345 + if (apbs[i].irq) 346 + free_irq(apbs[i].irq, &dummy); 347 + iounmap(apbs[i].RamIO); 348 + } 349 + pci_disable_device(dev); 350 + return ret; 345 351 } 346 352 347 353