aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/devinet.c
diff options
context:
space:
mode:
authorDenis V. Lunev <den@openvz.org>2007-11-30 08:21:31 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 17:54:24 -0500
commitb854272b3c732316676e9128f7b9e6f1e1ff88b0 (patch)
treec90c74b9ec068453881f1173da4c57d6bb00a7d9 /net/ipv4/devinet.c
parentad5d20a63940fcfb40af76ba06148f36d5d0b433 (diff)
[NET]: Modify all rtnetlink methods to only work in the initial namespace (v2)
Before I can enable rtnetlink to work in all network namespaces I need to be certain that something won't break. So this patch deliberately disables all of the rtnletlink methods in everything except the initial network namespace. After the methods have been audited this extra check can be disabled. Changes from v1: - added IPv6 addrlabel protection Signed-off-by: Denis V. Lunev <den@openvz.org> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'net/ipv4/devinet.c')
-rw-r--r--net/ipv4/devinet.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index b42f74617bac..c0eb26a0d0bc 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -441,6 +441,7 @@ struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
441 441
442static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) 442static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
443{ 443{
444 struct net *net = skb->sk->sk_net;
444 struct nlattr *tb[IFA_MAX+1]; 445 struct nlattr *tb[IFA_MAX+1];
445 struct in_device *in_dev; 446 struct in_device *in_dev;
446 struct ifaddrmsg *ifm; 447 struct ifaddrmsg *ifm;
@@ -449,6 +450,9 @@ static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg
449 450
450 ASSERT_RTNL(); 451 ASSERT_RTNL();
451 452
453 if (net != &init_net)
454 return -EINVAL;
455
452 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy); 456 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv4_policy);
453 if (err < 0) 457 if (err < 0)
454 goto errout; 458 goto errout;
@@ -560,10 +564,14 @@ errout:
560 564
561static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) 565static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
562{ 566{
567 struct net *net = skb->sk->sk_net;
563 struct in_ifaddr *ifa; 568 struct in_ifaddr *ifa;
564 569
565 ASSERT_RTNL(); 570 ASSERT_RTNL();
566 571
572 if (net != &init_net)
573 return -EINVAL;
574
567 ifa = rtm_to_ifaddr(nlh); 575 ifa = rtm_to_ifaddr(nlh);
568 if (IS_ERR(ifa)) 576 if (IS_ERR(ifa))
569 return PTR_ERR(ifa); 577 return PTR_ERR(ifa);
@@ -1174,12 +1182,16 @@ nla_put_failure:
1174 1182
1175static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) 1183static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
1176{ 1184{
1185 struct net *net = skb->sk->sk_net;
1177 int idx, ip_idx; 1186 int idx, ip_idx;
1178 struct net_device *dev; 1187 struct net_device *dev;
1179 struct in_device *in_dev; 1188 struct in_device *in_dev;
1180 struct in_ifaddr *ifa; 1189 struct in_ifaddr *ifa;
1181 int s_ip_idx, s_idx = cb->args[0]; 1190 int s_ip_idx, s_idx = cb->args[0];
1182 1191
1192 if (net != &init_net)
1193 return 0;
1194
1183 s_ip_idx = ip_idx = cb->args[1]; 1195 s_ip_idx = ip_idx = cb->args[1];
1184 idx = 0; 1196 idx = 0;
1185 for_each_netdev(&init_net, dev) { 1197 for_each_netdev(&init_net, dev) {