diff options
| author | Tom Parkin <tparkin@katalix.com> | 2013-03-19 06:11:18 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-03-20 12:10:39 -0400 | 
| commit | 02d13ed5f94af38c37d1abd53462fe48d78bcc9d (patch) | |
| tree | 4685646061029ae3aba116410564cdad6da55e47 /net/l2tp | |
| 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/l2tp')
| -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)  		return;  	sock = sk->sk_socket; -	BUG_ON(!sock); -	/* If the tunnel socket was created directly by the kernel, use the -	 * sk_* API to release the socket now.  Otherwise go through the -	 * inet_* layer to shut the socket down, and let userspace close it. +	/* If the tunnel socket was created by userspace, then go through the +	 * inet layer to shut the socket down, and let userspace close it. +	 * Otherwise, if we created the socket directly within the kernel, use +	 * the sk API to release it here.  	 * In either case the tunnel resources are freed in the socket  	 * destructor when the tunnel socket goes away.  	 */ -	if (sock->file == NULL) { -		kernel_sock_shutdown(sock, SHUT_RDWR); -		sk_release_kernel(sk); +	if (tunnel->fd >= 0) { +		if (sock) +			inet_shutdown(sock, 2);  	} else { -		inet_shutdown(sock, 2); +		if (sock) +			kernel_sock_shutdown(sock, SHUT_RDWR); +		sk_release_kernel(sk);  	}  	l2tp_tunnel_sock_put(sk); | 
