aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@openvz.org>2008-03-26 19:49:40 -0400
committerDavid S. Miller <davem@davemloft.net>2008-03-26 19:49:40 -0400
commita233352506be35aafd49c0ba8c88ca96ebde1c3d (patch)
tree61bcc9f1f7a84ab926e0f2c8c32fe52e9124da3d /net/ipv6
parent9b674e82b73a61844967b32e1b4ecaf8eb9d1805 (diff)
[IPV6]: Fix potential net leak and oops in ipv6 routing code.
The commits f3db4851 ([NETNS][IPV6] ip6_fib - fib6_clean_all handle several network namespaces) and 69ddb805 ([NETNS][IPV6] route6 - Make proc entry /proc/net/rt6_stats per namespace) made some proc files per net. Both of them introduced potential OOPS - get_proc_net can return NULL, but this check is lost - and a struct net leak - in case single_open() fails the previously got net is not put. Kill all these bugs with one patch. Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Acked-by: Daniel Lezcano <dlezcano@fr.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/route.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index ac4428371432..cd82b6db35ff 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -2390,10 +2390,18 @@ static int ipv6_route_show(struct seq_file *m, void *v)
2390 2390
2391static int ipv6_route_open(struct inode *inode, struct file *file) 2391static int ipv6_route_open(struct inode *inode, struct file *file)
2392{ 2392{
2393 int err;
2393 struct net *net = get_proc_net(inode); 2394 struct net *net = get_proc_net(inode);
2394 if (!net) 2395 if (!net)
2395 return -ENXIO; 2396 return -ENXIO;
2396 return single_open(file, ipv6_route_show, net); 2397
2398 err = single_open(file, ipv6_route_show, net);
2399 if (err < 0) {
2400 put_net(net);
2401 return err;
2402 }
2403
2404 return 0;
2397} 2405}
2398 2406
2399static int ipv6_route_release(struct inode *inode, struct file *file) 2407static int ipv6_route_release(struct inode *inode, struct file *file)
@@ -2429,8 +2437,18 @@ static int rt6_stats_seq_show(struct seq_file *seq, void *v)
2429 2437
2430static int rt6_stats_seq_open(struct inode *inode, struct file *file) 2438static int rt6_stats_seq_open(struct inode *inode, struct file *file)
2431{ 2439{
2440 int err;
2432 struct net *net = get_proc_net(inode); 2441 struct net *net = get_proc_net(inode);
2433 return single_open(file, rt6_stats_seq_show, net); 2442 if (!net)
2443 return -ENXIO;
2444
2445 err = single_open(file, rt6_stats_seq_show, net);
2446 if (err < 0) {
2447 put_net(net);
2448 return err;
2449 }
2450
2451 return 0;
2434} 2452}
2435 2453
2436static int rt6_stats_seq_release(struct inode *inode, struct file *file) 2454static int rt6_stats_seq_release(struct inode *inode, struct file *file)