diff options
author | Tom Parkin <tparkin@katalix.com> | 2013-03-19 02:11:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-03-20 12:10:39 -0400 |
commit | 02d13ed5f94af38c37d1abd53462fe48d78bcc9d (patch) | |
tree | 4685646061029ae3aba116410564cdad6da55e47 /net | |
parent | 8abbbe8ff572fd84d1b98eb9acf30611a97cf72e (diff) |
l2tp: don't BUG_ON sk_socket being NULL
It is valid for an existing struct sock object to have a NULL sk_socket
pointer, so don't BUG_ON in l2tp_tunnel_del_work if that should occur.
Signed-off-by: Tom Parkin <tparkin@katalix.com>
Signed-off-by: James Chapman <jchapman@katalix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/l2tp/l2tp_core.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c index 45373fee38c5..e841ef2a68a5 100644 --- a/net/l2tp/l2tp_core.c +++ b/net/l2tp/l2tp_core.c | |||
@@ -1412,19 +1412,21 @@ static void l2tp_tunnel_del_work(struct work_struct *work) | |||
1412 | return; | 1412 | return; |
1413 | 1413 | ||
1414 | sock = sk->sk_socket; | 1414 | sock = sk->sk_socket; |
1415 | BUG_ON(!sock); | ||
1416 | 1415 | ||
1417 | /* If the tunnel socket was created directly by the kernel, use the | 1416 | /* If the tunnel socket was created by userspace, then go through the |
1418 | * sk_* API to release the socket now. Otherwise go through the | 1417 | * inet layer to shut the socket down, and let userspace close it. |
1419 | * inet_* layer to shut the socket down, and let userspace close it. | 1418 | * Otherwise, if we created the socket directly within the kernel, use |
1419 | * the sk API to release it here. | ||
1420 | * In either case the tunnel resources are freed in the socket | 1420 | * In either case the tunnel resources are freed in the socket |
1421 | * destructor when the tunnel socket goes away. | 1421 | * destructor when the tunnel socket goes away. |
1422 | */ | 1422 | */ |
1423 | if (sock->file == NULL) { | 1423 | if (tunnel->fd >= 0) { |
1424 | kernel_sock_shutdown(sock, SHUT_RDWR); | 1424 | if (sock) |
1425 | sk_release_kernel(sk); | 1425 | inet_shutdown(sock, 2); |
1426 | } else { | 1426 | } else { |
1427 | inet_shutdown(sock, 2); | 1427 | if (sock) |
1428 | kernel_sock_shutdown(sock, SHUT_RDWR); | ||
1429 | sk_release_kernel(sk); | ||
1428 | } | 1430 | } |
1429 | 1431 | ||
1430 | l2tp_tunnel_sock_put(sk); | 1432 | l2tp_tunnel_sock_put(sk); |