Thread (3 messages) flat view 3 messages, 3 authors, 2012-06-11

Re: [PATCH] inet: Initialize per-netns inetpeer roots in net/ipv{4,6}/route.c

From: Fengguang Wu <hidden>
Date: 2012-06-10 10:16:40
Subsystem: networking [general], networking [ipv4/ipv6], networking [tcp], the rest · Maintainers: "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, David Ahern, Ido Schimmel, Neal Cardwell, Linus Torvalds

Possibly related (same subject, not in this thread)

On Sat, Jun 09, 2012 at 10:18:01PM -0400, David Miller wrote:
From: David Miller <davem@davemloft.net>
Date: Sat, 09 Jun 2012 19:09:29 -0700 (PDT)
quoted
From: Fengguang Wu <redacted>
Date: Sun, 10 Jun 2012 10:08:01 +0800
quoted
And in another config, an old error still triggers:

net/ipv4/inetpeer.c: In function ‘family_to_base’:
net/ipv4/inetpeer.c:397:50: error: ‘struct net’ has no member named ‘ipv6’
net/ipv4/inetpeer.c:398:1: warning: control reaches end of non-void function [-Wreturn-type]

I'm building this patch on top of net-next master.
What a fucking mess Gao created, I'll fix this.

Thanks for the report.
I just pushed the following to net-next:

--------------------
inet: Pass inetpeer root into inet_getpeer*() interfaces.

Otherwise we reference potentially non-existing members when
ipv6 is disabled.

Signed-off-by: David S. Miller <davem@davemloft.net>
---
 include/net/inetpeer.h |   10 +++++-----
 net/ipv4/inetpeer.c    |    9 +--------
 net/ipv4/ip_fragment.c |    2 +-
 net/ipv4/route.c       |    6 +++---
 net/ipv6/route.c       |    2 +-
 5 files changed, 11 insertions(+), 18 deletions(-)
It triggers some other errors:

net/ipv4/inetpeer.c: In function ‘inetpeer_invalidate_tree’:
net/ipv4/inetpeer.c:585:9: error: implicit declaration of function ‘family_to_base’ [-Werror=implicit-function-declaration]
net/ipv4/inetpeer.c:585:32: warning: initialization makes pointer from integer without a cast [enabled by default]
net/ipv6/tcp_ipv6.c:1758:2: warning: passing argument 1 of ‘inet_getpeer_v6’ from incompatible pointer type [enabled by default]
include/net/inetpeer.h:101:33: note: expected ‘struct inet_peer_base *’ but argument is of type ‘struct net *’
net/ipv4/tcp_ipv4.c:1843:2: warning: passing argument 1 of ‘inet_getpeer_v4’ from incompatible pointer type [enabled by default]
include/net/inetpeer.h:90:33: note: expected ‘struct inet_peer_base *’ but argument is of type ‘struct net *’

which can be fixed by the following diff.

Thanks,
Fengguang
---
 net/ipv4/inetpeer.c |    6 ++++++
 net/ipv4/tcp_ipv4.c |    2 +-
 net/ipv6/tcp_ipv6.c |    2 +-
 3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c
index 98cf1f8..7ad6b76 100644
--- a/net/ipv4/inetpeer.c
+++ b/net/ipv4/inetpeer.c
@@ -391,6 +391,12 @@ static void unlink_from_pool(struct inet_peer *p, struct inet_peer_base *base,
 	call_rcu(&p->rcu, inetpeer_free_rcu);
 }
 
+static struct inet_peer_base *family_to_base(struct net *net,
+					     int family)
+{
+	return family == AF_INET ? net->ipv4.peers : net->ipv6.peers;
+}
+
 /* perform garbage collect on all items stacked during a lookup */
 static int inet_peer_gc(struct inet_peer_base *base,
 			struct inet_peer __rcu **stack[PEER_MAXDEPTH],
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 77f049d..cf7fe92 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1840,7 +1840,7 @@ void *tcp_v4_tw_get_peer(struct sock *sk)
 	const struct inet_timewait_sock *tw = inet_twsk(sk);
 	struct net *net = sock_net(sk);
 
-	return inet_getpeer_v4(net, tw->tw_daddr, 1);
+	return inet_getpeer_v4(net->ipv4.peers, tw->tw_daddr, 1);
 }
 EXPORT_SYMBOL(tcp_v4_tw_get_peer);
 
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index b5ecf37..927c029 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -1755,7 +1755,7 @@ static void *tcp_v6_tw_get_peer(struct sock *sk)
 	if (tw->tw_family == AF_INET)
 		return tcp_v4_tw_get_peer(sk);
 
-	return inet_getpeer_v6(net, &tw6->tw_v6_daddr, 1);
+	return inet_getpeer_v6(net->ipv6.peers, &tw6->tw_v6_daddr, 1);
 }
 
 static struct timewait_sock_ops tcp6_timewait_sock_ops = {
-- 
1.7.10

_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help