diff options
author | David S. Miller <davem@davemloft.net> | 2011-03-02 16:27:41 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-02 16:27:41 -0500 |
commit | 452edd598f60522c11f7f88fdbab27eb36509d1a (patch) | |
tree | df1510e9848e591a412c8bfa724253470c48c4c2 /net/ipv4/icmp.c | |
parent | 3872b284087081ee5cb0e4630954c2f7a2153cf5 (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.c | 36 |
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 | ||
459 | relookup_failed: | 451 | relookup_failed: |