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;

Reply via email to