public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] staging: ft1000: fix skb, netdev, memory leaks
@ 2010-09-26  8:59 Vasiliy Kulikov
  0 siblings, 0 replies; 5+ messages in thread
From: Vasiliy Kulikov @ 2010-09-26  8:59 UTC (permalink / raw)
  To: kernel-janitors; +Cc: Greg Kroah-Hartman, Marek Belisko, devel, linux-kernel

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.
---
 Compile tested.

 drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c |   32 +++++++++++++--------
 1 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
index a6ba84c..eed7e94 100644
--- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
+++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
@@ -1686,6 +1686,7 @@ int ft1000_copy_up_pkt(struct net_device *dev)
 			  tempword);
 		ft1000_flush_fifo(dev, DSP_PKTPHCKSUM_INFO);
 		info->stats.rx_errors++;
+		kfree_skb(skb);
 		return FAILURE;
 	}
 	//subtract the number of bytes read already
@@ -1711,6 +1712,7 @@ int ft1000_copy_up_pkt(struct net_device *dev)
 			*pbuffer++ = (u8) (tempword >> 8);
 			*pbuffer++ = (u8) tempword;
 			if (ft1000_chkcard(dev) == FALSE) {
+				kfree_skb(skb);
 				return FAILURE;
 			}
 		}
@@ -2236,15 +2238,17 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
 
 	if (request_irq(dev->irq, ft1000_interrupt, IRQF_SHARED, dev->name, dev)) {
 		printk(KERN_ERR "ft1000: Could not request_irq\n");
-		kfree(dev);
-		return (NULL);
+		goto err_dev;
 	}
 
-	request_region(dev->base_addr, 256, dev->name);
+	if (request_region(dev->base_addr, 256, dev->name) == NULL) {
+		printk(KERN_ERR "ft1000: Could not request_region\n");
+		goto err_irq;
+	}
 
 	if (register_netdev(dev) != 0) {
 		DEBUG(0, "ft1000: Could not register netdev");
-		return NULL;
+		goto err_reg;
 	}
 
 	info->AsicID = ft1000_read_reg(dev, FT1000_REG_ASIC_ID);
@@ -2252,19 +2256,13 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
 		DEBUG(0, "ft1000_hw: ELECTRABUZZ ASIC\n");
 		if (request_firmware(&fw_entry, "ft1000.img", fdev) != 0) {
 			printk(KERN_INFO "ft1000: Could not open ft1000.img\n");
-			unregister_netdev(dev);
-			free_irq(dev->irq, dev);
-			kfree(dev);
-			return NULL;
+			goto err_unreg;
 		}
 	} else {
 		DEBUG(0, "ft1000_hw: MAGNEMITE ASIC\n");
 		if (request_firmware(&fw_entry, "ft2000.img", fdev) != 0) {
 			printk(KERN_INFO "ft1000: Could not open ft2000.img\n");
-			unregister_netdev(dev);
-			free_irq(dev->irq, dev);
-			kfree(dev);
-			return NULL;
+			goto err_unreg;
 		}
 	}
 
@@ -2279,6 +2277,16 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
 		   dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3],
 		   dev->dev_addr[4], dev->dev_addr[5]);
 	return dev;
+
+err_unreg:
+	unregister_netdev(dev);
+err_reg:
+	release_region(dev->base_addr, 256);
+err_irq:
+	free_irq(dev->irq, dev);
+err_dev:
+	free_netdev(dev);
+	return NULL;
 }
 
 EXPORT_SYMBOL(init_ft1000_card);
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH] staging: ft1000: fix skb, netdev, memory leaks
@ 2010-09-28 17:49 Vasiliy Kulikov
  2010-09-30 11:13 ` Greg KH
  0 siblings, 1 reply; 5+ messages in thread
From: Vasiliy Kulikov @ 2010-09-28 17:49 UTC (permalink / raw)
  To: kernel-janitors; +Cc: Greg Kroah-Hartman, Marek Belisko, devel, linux-kernel

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>
---
 Compile tested.

 drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c |   32 +++++++++++++--------
 1 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
index a6ba84c..eed7e94 100644
--- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
+++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
@@ -1686,6 +1686,7 @@ int ft1000_copy_up_pkt(struct net_device *dev)
 			  tempword);
 		ft1000_flush_fifo(dev, DSP_PKTPHCKSUM_INFO);
 		info->stats.rx_errors++;
+		kfree_skb(skb);
 		return FAILURE;
 	}
 	//subtract the number of bytes read already
@@ -1711,6 +1712,7 @@ int ft1000_copy_up_pkt(struct net_device *dev)
 			*pbuffer++ = (u8) (tempword >> 8);
 			*pbuffer++ = (u8) tempword;
 			if (ft1000_chkcard(dev) == FALSE) {
+				kfree_skb(skb);
 				return FAILURE;
 			}
 		}
@@ -2236,15 +2238,17 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
 
 	if (request_irq(dev->irq, ft1000_interrupt, IRQF_SHARED, dev->name, dev)) {
 		printk(KERN_ERR "ft1000: Could not request_irq\n");
-		kfree(dev);
-		return (NULL);
+		goto err_dev;
 	}
 
-	request_region(dev->base_addr, 256, dev->name);
+	if (request_region(dev->base_addr, 256, dev->name) == NULL) {
+		printk(KERN_ERR "ft1000: Could not request_region\n");
+		goto err_irq;
+	}
 
 	if (register_netdev(dev) != 0) {
 		DEBUG(0, "ft1000: Could not register netdev");
-		return NULL;
+		goto err_reg;
 	}
 
 	info->AsicID = ft1000_read_reg(dev, FT1000_REG_ASIC_ID);
@@ -2252,19 +2256,13 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
 		DEBUG(0, "ft1000_hw: ELECTRABUZZ ASIC\n");
 		if (request_firmware(&fw_entry, "ft1000.img", fdev) != 0) {
 			printk(KERN_INFO "ft1000: Could not open ft1000.img\n");
-			unregister_netdev(dev);
-			free_irq(dev->irq, dev);
-			kfree(dev);
-			return NULL;
+			goto err_unreg;
 		}
 	} else {
 		DEBUG(0, "ft1000_hw: MAGNEMITE ASIC\n");
 		if (request_firmware(&fw_entry, "ft2000.img", fdev) != 0) {
 			printk(KERN_INFO "ft1000: Could not open ft2000.img\n");
-			unregister_netdev(dev);
-			free_irq(dev->irq, dev);
-			kfree(dev);
-			return NULL;
+			goto err_unreg;
 		}
 	}
 
@@ -2279,6 +2277,16 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
 		   dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3],
 		   dev->dev_addr[4], dev->dev_addr[5]);
 	return dev;
+
+err_unreg:
+	unregister_netdev(dev);
+err_reg:
+	release_region(dev->base_addr, 256);
+err_irq:
+	free_irq(dev->irq, dev);
+err_dev:
+	free_netdev(dev);
+	return NULL;
 }
 
 EXPORT_SYMBOL(init_ft1000_card);
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] staging: ft1000: fix skb, netdev, memory leaks
  2010-09-28 17:49 [PATCH] staging: ft1000: fix skb, netdev, memory leaks Vasiliy Kulikov
@ 2010-09-30 11:13 ` Greg KH
  2010-09-30 19:23   ` Vasiliy Kulikov
  0 siblings, 1 reply; 5+ messages in thread
From: Greg KH @ 2010-09-30 11:13 UTC (permalink / raw)
  To: Vasiliy Kulikov
  Cc: kernel-janitors, devel, Marek Belisko, Greg Kroah-Hartman,
	linux-kernel

On Tue, Sep 28, 2010 at 09:49:35PM +0400, Vasiliy Kulikov wrote:
> 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>
> ---
>  Compile tested.

No you didn't

>  drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c |   32 +++++++++++++--------
>  1 files changed, 20 insertions(+), 12 deletions(-)

This file doesn't build at this point in time, how did you build test
this?

I don't mind taking the patch, but please, don't lie.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] staging: ft1000: fix skb, netdev, memory leaks
  2010-09-30 11:13 ` Greg KH
@ 2010-09-30 19:23   ` Vasiliy Kulikov
  2010-09-30 19:53     ` Greg KH
  0 siblings, 1 reply; 5+ messages in thread
From: Vasiliy Kulikov @ 2010-09-30 19:23 UTC (permalink / raw)
  To: Greg KH
  Cc: kernel-janitors, devel, Marek Belisko, Greg Kroah-Hartman,
	linux-kernel

On Thu, Sep 30, 2010 at 04:13 -0700, Greg KH wrote:
> On Tue, Sep 28, 2010 at 09:49:35PM +0400, Vasiliy Kulikov wrote:
> > 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>
> > ---
> >  Compile tested.
> 
> No you didn't

No I did:

make -C /home/vasya/linux drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.o
make: Вход в каталог `/home/vasya/dev/linux-next'
  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
  CALL    scripts/checksyscalls.sh
  CC      drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.o
drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c: In function ‘ft1000_reset_card’:
drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c:525: warning: passing argument 2 of ‘card_download’ discards qualifiers from pointer target type
drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c:56: note: expected ‘void *’ but argument is of type ‘const u8 * const’
make: Выход из каталога `/home/vasya/dev/linux-next'

However, 

    cd ../drivers/staging/ft1000/ft1000-pcmcia/
    LANG=C make -C ~/linux ft1000_hw.o
    make: Entering directory `/home/vasya/dev/linux-next'
    make: *** No rule to make target `ft1000_hw.o'.  Stop.
    make: Leaving directory `/home/vasya/dev/linux-next'


Is "make" from linux root buggy/not supported for staging/everything?

> 
> >  drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c |   32 +++++++++++++--------
> >  1 files changed, 20 insertions(+), 12 deletions(-)
> 
> This file doesn't build at this point in time, how did you build test
> this?
> 
> I don't mind taking the patch, but please, don't lie.
> 
> thanks,
> 
> greg k-h

-- 
Vasiliy

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] staging: ft1000: fix skb, netdev, memory leaks
  2010-09-30 19:23   ` Vasiliy Kulikov
@ 2010-09-30 19:53     ` Greg KH
  0 siblings, 0 replies; 5+ messages in thread
From: Greg KH @ 2010-09-30 19:53 UTC (permalink / raw)
  To: Vasiliy Kulikov
  Cc: Greg KH, kernel-janitors, devel, Marek Belisko, linux-kernel

On Thu, Sep 30, 2010 at 11:23:03PM +0400, Vasiliy Kulikov wrote:
> On Thu, Sep 30, 2010 at 04:13 -0700, Greg KH wrote:
> > On Tue, Sep 28, 2010 at 09:49:35PM +0400, Vasiliy Kulikov wrote:
> > > 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>
> > > ---
> > >  Compile tested.
> > 
> > No you didn't
> 
> No I did:
> 
> make -C /home/vasya/linux drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.o
> make: Вход в каталог `/home/vasya/dev/linux-next'
>   CHK     include/linux/version.h
>   CHK     include/generated/utsrelease.h
>   CALL    scripts/checksyscalls.sh
>   CC      drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.o
> drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c: In function ‘ft1000_reset_card’:
> drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c:525: warning: passing argument 2 of ‘card_download’ discards qualifiers from pointer target type
> drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c:56: note: expected ‘void *’ but argument is of type ‘const u8 * const’
> make: Выход из каталога `/home/vasya/dev/linux-next'

Heh, I didn't think to try that, amazed that it worked at all.

> However, 
> 
>     cd ../drivers/staging/ft1000/ft1000-pcmcia/
>     LANG=C make -C ~/linux ft1000_hw.o
>     make: Entering directory `/home/vasya/dev/linux-next'
>     make: *** No rule to make target `ft1000_hw.o'.  Stop.
>     make: Leaving directory `/home/vasya/dev/linux-next'
> 
> 
> Is "make" from linux root buggy/not supported for staging/everything?

This driver is marked broken, look at the Kconfig file:
	config FT1000_PCMCIA
	        tristate "Driver for ft1000 pcmcia device."
	        depends on PCMCIA && BROKEN


It will be fixed up soon hopefully.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-09-30 20:02 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-28 17:49 [PATCH] staging: ft1000: fix skb, netdev, memory leaks Vasiliy Kulikov
2010-09-30 11:13 ` Greg KH
2010-09-30 19:23   ` Vasiliy Kulikov
2010-09-30 19:53     ` Greg KH
  -- strict thread matches above, loose matches on Subject: below --
2010-09-26  8:59 Vasiliy Kulikov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox