aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2012-06-24 20:45:14 -0400
committerDavid S. Miller <davem@davemloft.net>2012-06-25 19:30:54 -0400
commitaa214de0595eecf5079a172a16333fa638b64915 (patch)
tree7bfb8c40355c96c01903a83f9ebd546f9bc1b73c /net
parent044ca2a5f2f781c7e4b49c7c0a256913648297ea (diff)
net: l2tp_eth: fix l2tp_eth_dev_xmit race
Its illegal to dereference skb after giving it to l2tp_xmit_skb() as it might be already freed/reused. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: James Chapman <jchapman@katalix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/l2tp/l2tp_eth.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c
index 185f12f4a5fa..c3738f49646a 100644
--- a/net/l2tp/l2tp_eth.c
+++ b/net/l2tp/l2tp_eth.c
@@ -88,12 +88,12 @@ static int l2tp_eth_dev_xmit(struct sk_buff *skb, struct net_device *dev)
88 struct l2tp_eth *priv = netdev_priv(dev); 88 struct l2tp_eth *priv = netdev_priv(dev);
89 struct l2tp_session *session = priv->session; 89 struct l2tp_session *session = priv->session;
90 90
91 l2tp_xmit_skb(session, skb, session->hdr_len);
92
93 dev->stats.tx_bytes += skb->len; 91 dev->stats.tx_bytes += skb->len;
94 dev->stats.tx_packets++; 92 dev->stats.tx_packets++;
95 93
96 return 0; 94 l2tp_xmit_skb(session, skb, session->hdr_len);
95
96 return NETDEV_TX_OK;
97} 97}
98 98
99static struct net_device_ops l2tp_eth_netdev_ops = { 99static struct net_device_ops l2tp_eth_netdev_ops = {