diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/icmp.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index e238b17f554c..02a899bec196 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -514,12 +514,15 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
514 | 514 | ||
515 | saddr = iph->daddr; | 515 | saddr = iph->daddr; |
516 | if (!(rt->rt_flags & RTCF_LOCAL)) { | 516 | if (!(rt->rt_flags & RTCF_LOCAL)) { |
517 | /* This is broken, skb_in->dev points to the outgoing device | 517 | struct net_device *dev = NULL; |
518 | * after the packet passes through ip_output(). | 518 | |
519 | */ | 519 | if (rt->fl.iif && sysctl_icmp_errors_use_inbound_ifaddr) |
520 | if (skb_in->dev && sysctl_icmp_errors_use_inbound_ifaddr) | 520 | dev = dev_get_by_index(rt->fl.iif); |
521 | saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK); | 521 | |
522 | else | 522 | if (dev) { |
523 | saddr = inet_select_addr(dev, 0, RT_SCOPE_LINK); | ||
524 | dev_put(dev); | ||
525 | } else | ||
523 | saddr = 0; | 526 | saddr = 0; |
524 | } | 527 | } |
525 | 528 | ||