Le 2018-12-05 13:03, Stuart Henderson a écrit :
On 2018/12/05 12:40, Arnaud BRAND wrote:
Or is there something else I missed ?
> > + if (ifa != NULL) src = &(ifa->ia_addr.sin6_addr);
> > + if (src == NULL) src =
&ifatoia6(rt->rt_ifa)->ia_addr.sin6_addr;
if (ifa != NULL)
src = &(ifa->ia_addr.sin6_addr);
if (src == NULL)
src = &ifatoia6(rt->rt_ifa)->ia_addr.sin6_addr;
Of course, that's quite me. The more obvious, the less I spot it.
I could have spent hours reading style(9) and writing code to compare
the size of structs.
Thanks a lot Stuart !
Here is an updated diff :
Index: sys/netinet6/icmp6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/icmp6.c,v
retrieving revision 1.227
diff -u -p -u -p -r1.227 icmp6.c
--- sys/netinet6/icmp6.c 9 Nov 2018 14:14:32 -0000 1.227
+++ sys/netinet6/icmp6.c 5 Dec 2018 13:31:02 -0000
@@ -1038,6 +1038,7 @@ icmp6_reflect(struct mbuf *m, size_t off
struct icmp6_hdr *icmp6;
struct in6_addr t, *src = NULL;
struct sockaddr_in6 sa6_src, sa6_dst;
+ struct in6_ifaddr *ifa;
u_int rtableid;
CTASSERT(sizeof(struct ip6_hdr) + sizeof(struct icmp6_hdr) <=
MHLEN);
@@ -1141,7 +1142,11 @@ icmp6_reflect(struct mbuf *m, size_t off
rtfree(rt);
goto bad;
}
- src = &ifatoia6(rt->rt_ifa)->ia_addr.sin6_addr;
+ ifa = in6_ifawithscope(rt->rt_ifa->ifa_ifp, &t,
rtableid);
+ if (ifa != NULL)
+ src = &(ifa->ia_addr.sin6_addr);
+ if (src == NULL)
+ src = &ifatoia6(rt->rt_ifa)->ia_addr.sin6_addr;
}
ip6->ip6_src = *src;