diff mbox

[1/1] l2tp: fix oops in l2tp_eth_create() error path

Message ID 1351590108-21067-1-git-send-email-tparkin@katalix.com
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Tom Parkin Oct. 30, 2012, 9:41 a.m. UTC
When creating an L2TPv3 Ethernet session, if register_netdev() should fail for
any reason (for example, automatic naming for "l2tpeth%d" interfaces hits the
32k-interface limit), the netdev is freed in the error path.  However, the
l2tp_eth_sess structure's dev pointer is left uncleared, and this results in
l2tp_eth_delete() then attempting to unregister the same netdev later in the
session teardown.  This results in an oops.

To avoid this, clear the session dev pointer in the error path.

Signed-off-by: Tom Parkin <tparkin@katalix.com>
---
 net/l2tp/l2tp_eth.c |    1 +
 1 file changed, 1 insertion(+)

Comments

David Miller Nov. 3, 2012, 1:57 a.m. UTC | #1
From: Tom Parkin <tparkin@katalix.com>
Date: Tue, 30 Oct 2012 09:41:48 +0000

> When creating an L2TPv3 Ethernet session, if register_netdev() should fail for
> any reason (for example, automatic naming for "l2tpeth%d" interfaces hits the
> 32k-interface limit), the netdev is freed in the error path.  However, the
> l2tp_eth_sess structure's dev pointer is left uncleared, and this results in
> l2tp_eth_delete() then attempting to unregister the same netdev later in the
> session teardown.  This results in an oops.
> 
> To avoid this, clear the session dev pointer in the error path.
> 
> Signed-off-by: Tom Parkin <tparkin@katalix.com>

Applied, thanks.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c
index 37b8b8b..76125c5 100644
--- a/net/l2tp/l2tp_eth.c
+++ b/net/l2tp/l2tp_eth.c
@@ -291,6 +291,7 @@  static int l2tp_eth_create(struct net *net, u32 tunnel_id, u32 session_id, u32 p
 
 out_del_dev:
 	free_netdev(dev);
+	spriv->dev = NULL;
 out_del_session:
 	l2tp_session_delete(session);
 out: