Do not use ``rt_addr'' in in{6,}_selectsrc() it doesn't work with magic
authormpi <mpi@openbsd.org>
Tue, 5 Jul 2016 09:17:10 +0000 (09:17 +0000)
committermpi <mpi@openbsd.org>
Tue, 5 Jul 2016 09:17:10 +0000 (09:17 +0000)
addresses set on p2p interfaces.

Found the hardway by naddy@

sys/netinet/in_pcb.c
sys/netinet6/in6_src.c

index 24526a9..a1ad89b 100644 (file)
@@ -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
index b26e0e6..6cecd70 100644 (file)
@@ -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 */