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

[media] lirc_bt829: Fix iomap and PCI device leaks

We must call iounmap() and pci_dev_put() when removed and on
the probe failure path.

Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>

authored by

Ben Hutchings and committed by
Mauro Carvalho Chehab
fd39abee d06d3ea7

+18 -3
+18 -3
drivers/staging/media/lirc/lirc_bt829.c
··· 82 82 } 83 83 if (pci_addr_phys == 0) { 84 84 pr_err("no memory resource ?\n"); 85 + pci_dev_put(my_dev); 85 86 return NULL; 86 87 } 87 88 } else { ··· 120 119 int init_module(void) 121 120 { 122 121 struct pci_dev *pdev; 122 + int rc; 123 123 124 124 pdev = do_pci_probe(); 125 125 if (pdev == NULL) 126 126 return -ENODEV; 127 127 128 - if (!atir_init_start()) 129 - return -ENODEV; 128 + if (!atir_init_start()) { 129 + rc = -ENODEV; 130 + goto err_put_dev; 131 + } 130 132 131 133 strcpy(atir_driver.name, "ATIR"); 132 134 atir_driver.minor = -1; ··· 145 141 atir_minor = lirc_register_driver(&atir_driver); 146 142 if (atir_minor < 0) { 147 143 pr_err("failed to register driver!\n"); 148 - return atir_minor; 144 + rc = atir_minor; 145 + goto err_unmap; 149 146 } 150 147 dprintk("driver is registered on minor %d\n", atir_minor); 151 148 152 149 return 0; 150 + 151 + err_unmap: 152 + iounmap(pci_addr_lin); 153 + err_put_dev: 154 + pci_dev_put(pdev); 155 + return rc; 153 156 } 154 157 155 158 156 159 void cleanup_module(void) 157 160 { 161 + struct pci_dev *pdev = to_pci_dev(atir_driver.dev); 162 + 158 163 lirc_unregister_driver(atir_minor); 164 + iounmap(pci_addr_lin); 165 + pci_dev_put(pdev); 159 166 } 160 167 161 168