| From foo@baz Fri Aug 4 15:15:01 PDT 2017 |
| From: Guillaume Nault <g.nault@alphalink.fr> |
| Date: Fri, 30 Dec 2016 19:48:19 +0100 |
| Subject: l2tp: consider '::' as wildcard address in l2tp_ip6 socket lookup |
| |
| From: Guillaume Nault <g.nault@alphalink.fr> |
| |
| |
| [ Upstream commit 97b84fd6d91766ea57dcc350d78f42639e011c30 ] |
| |
| An L2TP socket bound to the unspecified address should match with any |
| address. If not, it can't receive any packet and __l2tp_ip6_bind_lookup() |
| can't prevent another socket from binding on the same device/tunnel ID. |
| |
| While there, rename the 'addr' variable to 'sk_laddr' (local addr), to |
| make following patch clearer. |
| |
| Signed-off-by: Guillaume Nault <g.nault@alphalink.fr> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/l2tp/l2tp_ip6.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/net/l2tp/l2tp_ip6.c |
| +++ b/net/l2tp/l2tp_ip6.c |
| @@ -64,7 +64,7 @@ static struct sock *__l2tp_ip6_bind_look |
| struct sock *sk; |
| |
| sk_for_each_bound(sk, &l2tp_ip6_bind_table) { |
| - const struct in6_addr *addr = inet6_rcv_saddr(sk); |
| + const struct in6_addr *sk_laddr = inet6_rcv_saddr(sk); |
| struct l2tp_ip6_sock *l2tp = l2tp_ip6_sk(sk); |
| |
| if (l2tp == NULL) |
| @@ -72,7 +72,7 @@ static struct sock *__l2tp_ip6_bind_look |
| |
| if ((l2tp->conn_id == tunnel_id) && |
| net_eq(sock_net(sk), net) && |
| - (!addr || ipv6_addr_equal(addr, laddr)) && |
| + (!sk_laddr || ipv6_addr_any(sk_laddr) || ipv6_addr_equal(sk_laddr, laddr)) && |
| (!sk->sk_bound_dev_if || !dif || |
| sk->sk_bound_dev_if == dif)) |
| goto found; |