summaryrefslogtreecommitdiffstats
path: root/net/l2tp
diff options
context:
space:
mode:
authorGuillaume Nault <g.nault@alphalink.fr>2017-08-25 10:51:42 -0400
committerDavid S. Miller <davem@davemloft.net>2017-08-28 14:34:58 -0400
commitbb0a32ce4389e17e47e198d2cddaf141561581ad (patch)
tree9da4476f4f4c705441368f0d4c0c4a9edb7b2c74 /net/l2tp
parent54652eb12c1b72e9602d09cb2821d5760939190f (diff)
l2tp: hold tunnel while processing genl delete command
l2tp_nl_cmd_tunnel_delete() needs to take a reference on the tunnel, to prevent it from being concurrently freed by l2tp_tunnel_destruct(). Fixes: 309795f4bec2 ("l2tp: Add netlink control API for L2TP") Signed-off-by: Guillaume Nault <g.nault@alphalink.fr> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/l2tp')
-rw-r--r--net/l2tp/l2tp_netlink.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c
index 27ee94b5c189..808966550620 100644
--- a/net/l2tp/l2tp_netlink.c
+++ b/net/l2tp/l2tp_netlink.c
@@ -273,8 +273,8 @@ static int l2tp_nl_cmd_tunnel_delete(struct sk_buff *skb, struct genl_info *info
273 } 273 }
274 tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]); 274 tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
275 275
276 tunnel = l2tp_tunnel_find(net, tunnel_id); 276 tunnel = l2tp_tunnel_get(net, tunnel_id);
277 if (tunnel == NULL) { 277 if (!tunnel) {
278 ret = -ENODEV; 278 ret = -ENODEV;
279 goto out; 279 goto out;
280 } 280 }
@@ -284,6 +284,8 @@ static int l2tp_nl_cmd_tunnel_delete(struct sk_buff *skb, struct genl_info *info
284 284
285 (void) l2tp_tunnel_delete(tunnel); 285 (void) l2tp_tunnel_delete(tunnel);
286 286
287 l2tp_tunnel_dec_refcount(tunnel);
288
287out: 289out:
288 return ret; 290 return ret;
289} 291}