From b2da50a6459e56a644de7635f9068aa3faeb758a Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Fri, 1 Jun 2007 11:45:04 -0700 Subject: [PATCH] --- yaml --- r: 57332 b: refs/heads/master c: 6e1d91039becc9d5bcd046d8c709dbaf471220e3 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/ipv4/icmp.c | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index fb6c7e88e264..f720aaddbd02 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 584bdf8cbdf6f277c2a00e083257ee75687cf6f4 +refs/heads/master: 6e1d91039becc9d5bcd046d8c709dbaf471220e3 diff --git a/trunk/net/ipv4/icmp.c b/trunk/net/ipv4/icmp.c index e238b17f554c..02a899bec196 100644 --- a/trunk/net/ipv4/icmp.c +++ b/trunk/net/ipv4/icmp.c @@ -514,12 +514,15 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) saddr = iph->daddr; if (!(rt->rt_flags & RTCF_LOCAL)) { - /* This is broken, skb_in->dev points to the outgoing device - * after the packet passes through ip_output(). - */ - if (skb_in->dev && sysctl_icmp_errors_use_inbound_ifaddr) - saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK); - else + struct net_device *dev = NULL; + + if (rt->fl.iif && sysctl_icmp_errors_use_inbound_ifaddr) + dev = dev_get_by_index(rt->fl.iif); + + if (dev) { + saddr = inet_select_addr(dev, 0, RT_SCOPE_LINK); + dev_put(dev); + } else saddr = 0; }