|
@@ -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;
|
|
|
}
|
|
|
|