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

staging: ft1000: fix skb, netdev, memory leaks

ft1000_copy_up_pkt() doesn't free skb on errors.
init_ft1000_card() doesn't free netdev with free_netdev() but with kfree().
init_ft1000_card() doesn't check request_region()'s return value
and doesn't free region on error.

Signed-off-by: Vasiliy Kulikov <segooon@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Vasiliy Kulikov and committed by
Greg Kroah-Hartman
c95aef41 52cab756

+20 -12
+20 -12
drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
··· 1686 1686 tempword); 1687 1687 ft1000_flush_fifo(dev, DSP_PKTPHCKSUM_INFO); 1688 1688 info->stats.rx_errors++; 1689 + kfree_skb(skb); 1689 1690 return FAILURE; 1690 1691 } 1691 1692 //subtract the number of bytes read already ··· 1712 1711 *pbuffer++ = (u8) (tempword >> 8); 1713 1712 *pbuffer++ = (u8) tempword; 1714 1713 if (ft1000_chkcard(dev) == FALSE) { 1714 + kfree_skb(skb); 1715 1715 return FAILURE; 1716 1716 } 1717 1717 } ··· 2238 2236 2239 2237 if (request_irq(dev->irq, ft1000_interrupt, IRQF_SHARED, dev->name, dev)) { 2240 2238 printk(KERN_ERR "ft1000: Could not request_irq\n"); 2241 - kfree(dev); 2242 - return (NULL); 2239 + goto err_dev; 2243 2240 } 2244 2241 2245 - request_region(dev->base_addr, 256, dev->name); 2242 + if (request_region(dev->base_addr, 256, dev->name) == NULL) { 2243 + printk(KERN_ERR "ft1000: Could not request_region\n"); 2244 + goto err_irq; 2245 + } 2246 2246 2247 2247 if (register_netdev(dev) != 0) { 2248 2248 DEBUG(0, "ft1000: Could not register netdev"); 2249 - return NULL; 2249 + goto err_reg; 2250 2250 } 2251 2251 2252 2252 info->AsicID = ft1000_read_reg(dev, FT1000_REG_ASIC_ID); ··· 2256 2252 DEBUG(0, "ft1000_hw: ELECTRABUZZ ASIC\n"); 2257 2253 if (request_firmware(&fw_entry, "ft1000.img", fdev) != 0) { 2258 2254 printk(KERN_INFO "ft1000: Could not open ft1000.img\n"); 2259 - unregister_netdev(dev); 2260 - free_irq(dev->irq, dev); 2261 - kfree(dev); 2262 - return NULL; 2255 + goto err_unreg; 2263 2256 } 2264 2257 } else { 2265 2258 DEBUG(0, "ft1000_hw: MAGNEMITE ASIC\n"); 2266 2259 if (request_firmware(&fw_entry, "ft2000.img", fdev) != 0) { 2267 2260 printk(KERN_INFO "ft1000: Could not open ft2000.img\n"); 2268 - unregister_netdev(dev); 2269 - free_irq(dev->irq, dev); 2270 - kfree(dev); 2271 - return NULL; 2261 + goto err_unreg; 2272 2262 } 2273 2263 } 2274 2264 ··· 2277 2279 dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], 2278 2280 dev->dev_addr[4], dev->dev_addr[5]); 2279 2281 return dev; 2282 + 2283 + err_unreg: 2284 + unregister_netdev(dev); 2285 + err_reg: 2286 + release_region(dev->base_addr, 256); 2287 + err_irq: 2288 + free_irq(dev->irq, dev); 2289 + err_dev: 2290 + free_netdev(dev); 2291 + return NULL; 2280 2292 } 2281 2293 2282 2294 EXPORT_SYMBOL(init_ft1000_card);