aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2015-01-02 21:26:05 -0500
committerDavid S. Miller <davem@davemloft.net>2015-01-04 22:21:33 -0500
commit46b1e4f9115d48d17bb92f612e4fa45a521a0537 (patch)
treeedd0f79855de7b3c410af090e2d1a7790ab362d6 /net
parentdf5dba8e52be50e615e03ef73b34611d82587f42 (diff)
geneve: Check family when reusing sockets.
When searching for an existing socket to reuse, the address family is not taken into account - only port number. This means that an IPv4 socket could be used for IPv6 traffic and vice versa, which is sure to cause problems when passing packets. It is not possible to trigger this problem currently because the only user of Geneve creates just IPv4 sockets. However, that is likely to change in the near future. Signed-off-by: Jesse Gross <jesse@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/geneve.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/net/ipv4/geneve.c b/net/ipv4/geneve.c
index 4fe5a592821c..5b52046ec7a2 100644
--- a/net/ipv4/geneve.c
+++ b/net/ipv4/geneve.c
@@ -65,14 +65,15 @@ static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb)
65 return (struct genevehdr *)(udp_hdr(skb) + 1); 65 return (struct genevehdr *)(udp_hdr(skb) + 1);
66} 66}
67 67
68/* Find geneve socket based on network namespace and UDP port */ 68static struct geneve_sock *geneve_find_sock(struct net *net,
69static struct geneve_sock *geneve_find_sock(struct net *net, __be16 port) 69 sa_family_t family, __be16 port)
70{ 70{
71 struct geneve_net *gn = net_generic(net, geneve_net_id); 71 struct geneve_net *gn = net_generic(net, geneve_net_id);
72 struct geneve_sock *gs; 72 struct geneve_sock *gs;
73 73
74 list_for_each_entry(gs, &gn->sock_list, list) { 74 list_for_each_entry(gs, &gn->sock_list, list) {
75 if (inet_sk(gs->sock->sk)->inet_sport == port) 75 if (inet_sk(gs->sock->sk)->inet_sport == port &&
76 inet_sk(gs->sock->sk)->sk.sk_family == family)
76 return gs; 77 return gs;
77 } 78 }
78 79
@@ -375,7 +376,7 @@ struct geneve_sock *geneve_sock_add(struct net *net, __be16 port,
375 376
376 mutex_lock(&geneve_mutex); 377 mutex_lock(&geneve_mutex);
377 378
378 gs = geneve_find_sock(net, port); 379 gs = geneve_find_sock(net, ipv6 ? AF_INET6 : AF_INET, port);
379 if (gs) { 380 if (gs) {
380 if (!no_share && gs->rcv == rcv) 381 if (!no_share && gs->rcv == rcv)
381 gs->refcnt++; 382 gs->refcnt++;