From: mpi Date: Tue, 5 Jul 2016 09:17:10 +0000 (+0000) Subject: Do not use ``rt_addr'' in in{6,}_selectsrc() it doesn't work with magic X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=fe29d91b2d4245699d8cba1cbd2702b9263d4f1f;p=openbsd Do not use ``rt_addr'' in in{6,}_selectsrc() it doesn't work with magic addresses set on p2p interfaces. Found the hardway by naddy@ --- diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 24526a9e6bd..a1ad89bb637 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in_pcb.c,v 1.208 2016/06/30 12:36:27 mpi Exp $ */ +/* $OpenBSD: in_pcb.c,v 1.209 2016/07/05 09:17:10 mpi Exp $ */ /* $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $ */ /* @@ -879,6 +879,7 @@ in_selectsrc(struct in_addr **insrc, struct sockaddr_in *sin, u_int rtableid) { struct sockaddr_in *sin2; + struct in_ifaddr *ia = NULL; /* * If the socket(if any) is already bound, use that bound address @@ -900,8 +901,6 @@ in_selectsrc(struct in_addr **insrc, struct sockaddr_in *sin, ifp = if_get(mopts->imo_ifidx); if (ifp != NULL) { - struct in_ifaddr *ia = NULL; - if (ifp->if_rdomain == rtable_l2(rtableid)) IFP_TO_IA(ifp, ia); if (ia == NULL) { @@ -942,12 +941,14 @@ in_selectsrc(struct in_addr **insrc, struct sockaddr_in *sin, * If we found a route, use the address * corresponding to the outgoing interface. */ - if (ro->ro_rt != NULL) { - *insrc = &satosin(ro->ro_rt->rt_addr)->sin_addr; - return (0); - } + if (ro->ro_rt != NULL) + ia = ifatoia(ro->ro_rt->rt_ifa); - return (EADDRNOTAVAIL); + if (ia == NULL) + return (EADDRNOTAVAIL); + + *insrc = &ia->ia_addr.sin_addr; + return (0); } void diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c index b26e0e645d2..6cecd702199 100644 --- a/sys/netinet6/in6_src.c +++ b/sys/netinet6/in6_src.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in6_src.c,v 1.74 2016/06/30 12:36:27 mpi Exp $ */ +/* $OpenBSD: in6_src.c,v 1.75 2016/07/05 09:17:10 mpi Exp $ */ /* $KAME: in6_src.c,v 1.36 2001/02/06 04:08:17 itojun Exp $ */ /* @@ -257,11 +257,8 @@ in6_selectsrc(struct in6_addr **in6src, struct sockaddr_in6 *dstsock, ia6 = in6_ifawithscope(ifp, dst, rtableid); if_put(ifp); } - if (ia6 == NULL) { /* xxx scope error ?*/ - *in6src = - &satosin6(ro->ro_rt->rt_addr)->sin6_addr; - return (0); - } + if (ia6 == NULL) /* xxx scope error ?*/ + ia6 = ifatoia6(ro->ro_rt->rt_ifa); } if (ia6 == NULL) return (EHOSTUNREACH); /* no route */