Skip to contentSkip to conversation

staging: ks7010_sdio: fix NULL pointer dereference and memory leak

PATCH Superseded Gustavo A. R. Silva 2 participants 3 messages Apr 12, 2018 Staging

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 staging: ks7010_sdio: fix NULL pointer dereference and memory leak

priv is being dereferenced when it is still null, hence there is an explicit null pointer dereference at line 935: free_netdev(priv->net_dev)

Also, memory allocated for netdev at line 854:
netdev = alloc_etherdev(sizeof(*priv));
is not being free'd, hence there is a memory leak.

Fix this by null checking priv before dererefencing it and free netdev before return.

Addresses-Coverity-ID: 1467844 ("Explicit null dereferenced")

---
 drivers/staging/ks7010/ks7010_sdio.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/staging/ks7010/ks7010_sdio.c +6 -2
index b8f55a1..f5d4c62 100644
@@ -932,8 +932,12 @@ static int ks7010_sdio_probe(struct sdio_func *func,
 	return 0;
 
  err_free_netdev:
-	free_netdev(priv->net_dev);
-	card->priv = NULL;
+	if (priv) {
+		free_netdev(priv->net_dev);
+		card->priv = NULL;
+	} else {
+		free_netdev(netdev);
+	}
  err_release_irq:
 	sdio_claim_host(func);
 	sdio_release_irq(func);
Signature · 1 line
2.7.4
#1 lore raw

I added Colin to the Cc list.

Quoted 21 lines · Gustavo A. R. Silva

priv is being dereferenced when it is still null, hence there is an explicit null pointer dereference at line 935: free_netdev(priv->net_dev)

Also, memory allocated for netdev at line 854:
netdev = alloc_etherdev(sizeof(*priv));
is not being free'd, hence there is a memory leak.

Fix this by null checking priv before dererefencing it and free netdev before return.

Addresses-Coverity-ID: 1467844 ("Explicit null dereferenced")

---
 drivers/staging/ks7010/ks7010_sdio.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/staging/ks7010/ks7010_sdio.c +0 -0
index b8f55a1..f5d4c62 100644

drivers/staging/ks7010/ks7010_sdio.c static int ks7010_sdio_probe(struct sdio_func *func, · line 937

Quoted 8 lines
drivers/staging/ks7010/ks7010_sdio.c +3 -2
@@ -932,8 +932,12 @@ static int ks7010_sdio_probe(struct sdio_func *func,
 	return 0;
 
  err_free_netdev:
-	free_netdev(priv->net_dev);
-	card->priv = NULL;
+	if (priv) {
+		free_netdev(priv->net_dev);
+		card->priv = NULL;

This isn't required because the next thing we do to card is kfree(card).

drivers/staging/ks7010/ks7010_sdio.c static int ks7010_sdio_probe(struct sdio_func *func, · line 940

Quoted 3 lines
drivers/staging/ks7010/ks7010_sdio.c +3 -0
+	} else {
+		free_netdev(netdev);
+	}

That's too complicated. Just do:

err_free_netdev:

	free_netdev(net_dev);

err_release_irq:

	...

Please send a v2 patch.

regards,
dan carpenter

_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

#2 lore raw

Hi Dan,

Quoted 26 lines · Dan Carpenter

I added Colin to the Cc list.

Quoted 23 lines · Gustavo A. R. Silva

priv is being dereferenced when it is still null, hence there is an explicit null pointer dereference at line 935: free_netdev(priv->net_dev)

Also, memory allocated for netdev at line 854:
netdev = alloc_etherdev(sizeof(*priv));
is not being free'd, hence there is a memory leak.

Fix this by null checking priv before dererefencing it and free netdev before return.

Addresses-Coverity-ID: 1467844 ("Explicit null dereferenced")

---
  drivers/staging/ks7010/ks7010_sdio.c | 8 ++++++--
  1 file changed, 6 insertions(+), 2 deletions(-)
drivers/staging/ks7010/ks7010_sdio.c +0 -0
index b8f55a1..f5d4c62 100644
@@ -932,8 +932,12 @@ static int ks7010_sdio_probe(struct sdio_func *func,
  	return 0;
 
Quoted 9 lines

drivers/staging/ks7010/ks7010_sdio.c static int ks7010_sdio_probe(struct sdio_func *func, · line 937

Quoted 6 lines
drivers/staging/ks7010/ks7010_sdio.c +3 -2
   err_free_netdev:
-	free_netdev(priv->net_dev);
-	card->priv = NULL;
+	if (priv) {
+		free_netdev(priv->net_dev);
+		card->priv = NULL;

This isn't required because the next thing we do to card is kfree(card).

I got it.

Quoted 7 lines

drivers/staging/ks7010/ks7010_sdio.c static int ks7010_sdio_probe(struct sdio_func *func, · line 940

Quoted 3 lines
drivers/staging/ks7010/ks7010_sdio.c +3 -0
+	} else {
+		free_netdev(netdev);
+	}

That's too complicated. Just do:

Quoted 8 lines

err_free_netdev:

	free_netdev(net_dev);

err_release_irq:

	...

Please send a v2 patch.

Sure thing, I'll send it shortly.

Thanks for the feedback.
--
Gustavo