aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/icmp.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-03-02 16:27:41 -0500
committerDavid S. Miller <davem@davemloft.net>2011-03-02 16:27:41 -0500
commit452edd598f60522c11f7f88fdbab27eb36509d1a (patch)
treedf1510e9848e591a412c8bfa724253470c48c4c2 /net/ipv4/icmp.c
parent3872b284087081ee5cb0e4630954c2f7a2153cf5 (diff)
xfrm: Return dst directly from xfrm_lookup()
Instead of on the stack. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/icmp.c')
-rw-r--r--net/ipv4/icmp.c36
1 files changed, 14 insertions, 22 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 2a86c8951dcd..c23bd8cdeee0 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -398,18 +398,14 @@ static struct rtable *icmp_route_lookup(struct net *net, struct sk_buff *skb_in,
398 if (!fl.fl4_src) 398 if (!fl.fl4_src)
399 fl.fl4_src = rt->rt_src; 399 fl.fl4_src = rt->rt_src;
400 400
401 err = xfrm_lookup(net, (struct dst_entry **)&rt, &fl, NULL, 0); 401 rt = (struct rtable *) xfrm_lookup(net, &rt->dst, &fl, NULL, 0);
402 switch (err) { 402 if (!IS_ERR(rt)) {
403 case 0:
404 if (rt != rt2) 403 if (rt != rt2)
405 return rt; 404 return rt;
406 break; 405 } else if (PTR_ERR(rt) == -EPERM) {
407 case -EPERM:
408 rt = NULL; 406 rt = NULL;
409 break; 407 } else
410 default: 408 return rt;
411 return ERR_PTR(err);
412 }
413 409
414 err = xfrm_decode_session_reverse(skb_in, &fl, AF_INET); 410 err = xfrm_decode_session_reverse(skb_in, &fl, AF_INET);
415 if (err) 411 if (err)
@@ -438,22 +434,18 @@ static struct rtable *icmp_route_lookup(struct net *net, struct sk_buff *skb_in,
438 if (err) 434 if (err)
439 goto relookup_failed; 435 goto relookup_failed;
440 436
441 err = xfrm_lookup(net, (struct dst_entry **)&rt2, &fl, NULL, 437 rt2 = (struct rtable *) xfrm_lookup(net, &rt2->dst, &fl, NULL, XFRM_LOOKUP_ICMP);
442 XFRM_LOOKUP_ICMP); 438 if (!IS_ERR(rt2)) {
443 switch (err) {
444 case 0:
445 dst_release(&rt->dst); 439 dst_release(&rt->dst);
446 rt = rt2; 440 rt = rt2;
447 break; 441 } else if (PTR_ERR(rt2) == -EPERM) {
448 case -EPERM: 442 if (rt)
449 return ERR_PTR(err); 443 dst_release(&rt->dst);
450 default: 444 return rt2;
451 if (!rt) 445 } else {
452 return ERR_PTR(err); 446 err = PTR_ERR(rt2);
453 break; 447 goto relookup_failed;
454 } 448 }
455
456
457 return rt; 449 return rt;
458 450
459relookup_failed: 451relookup_failed: