diff options
author | 2017-08-23 11:25:07 +0000 | |
---|---|---|
committer | 2017-08-23 11:25:07 +0000 | |
commit | 9acb278eab62424d6cb1508fcf06a6908dd3b7ac (patch) | |
tree | 09e0318ec8ef75555ea099b3fc38843275794ce2 | |
parent | sync with upstream; unbound 1.6.5 (diff) | |
download | wireguard-openbsd-9acb278eab62424d6cb1508fcf06a6908dd3b7ac.tar.xz wireguard-openbsd-9acb278eab62424d6cb1508fcf06a6908dd3b7ac.zip |
No need to handle more than one routing message here.
-rw-r--r-- | usr.sbin/route6d/route6d.c | 292 |
1 files changed, 145 insertions, 147 deletions
diff --git a/usr.sbin/route6d/route6d.c b/usr.sbin/route6d/route6d.c index d695f2b88c4..aa0fb0cf85b 100644 --- a/usr.sbin/route6d/route6d.c +++ b/usr.sbin/route6d/route6d.c @@ -1,4 +1,4 @@ -/* $OpenBSD: route6d.c,v 1.91 2016/08/05 11:38:00 jca Exp $ */ +/* $OpenBSD: route6d.c,v 1.92 2017/08/23 11:25:07 jca Exp $ */ /* $KAME: route6d.c,v 1.111 2006/10/25 06:38:13 jinmei Exp $ */ /* @@ -1531,167 +1531,165 @@ rtrecv(void) log_debug(""); } - for (p = buf; p - buf < len; p += ((struct rt_msghdr *)p)->rtm_msglen) { - /* safety against bogus message */ - if (((struct rt_msghdr *)p)->rtm_msglen <= 0) { - log_debug("bogus rtmsg: length=%d", - ((struct rt_msghdr *)p)->rtm_msglen); - break; - } - if (((struct rt_msghdr *)p)->rtm_version != RTM_VERSION) - continue; + p = buf; + /* safety against bogus message */ + if (((struct rt_msghdr *)p)->rtm_msglen <= 0) { + log_debug("bogus rtmsg: length=%d", + ((struct rt_msghdr *)p)->rtm_msglen); + return; + } + if (((struct rt_msghdr *)p)->rtm_version != RTM_VERSION) + return; - rtm = NULL; - ifam = NULL; - ifm = NULL; - switch (((struct rt_msghdr *)p)->rtm_type) { - case RTM_NEWADDR: - case RTM_DELADDR: - ifam = (struct ifa_msghdr *)p; - addrs = ifam->ifam_addrs; - q = (char *)(ifam + 1); - break; - case RTM_IFINFO: - ifm = (struct if_msghdr *)p; - addrs = ifm->ifm_addrs; - q = (char *)(ifm + 1); - break; - default: - rtm = (struct rt_msghdr *)p; - addrs = rtm->rtm_addrs; - q = (char *)(p + rtm->rtm_hdrlen); - if (rtm->rtm_pid == pid) { + rtm = NULL; + ifam = NULL; + ifm = NULL; + switch (((struct rt_msghdr *)p)->rtm_type) { + case RTM_NEWADDR: + case RTM_DELADDR: + ifam = (struct ifa_msghdr *)p; + addrs = ifam->ifam_addrs; + q = (char *)(ifam + 1); + break; + case RTM_IFINFO: + ifm = (struct if_msghdr *)p; + addrs = ifm->ifm_addrs; + q = (char *)(ifm + 1); + break; + default: + rtm = (struct rt_msghdr *)p; + addrs = rtm->rtm_addrs; + q = (char *)(p + rtm->rtm_hdrlen); + if (rtm->rtm_pid == pid) { #if 0 - log_debug("rtmsg looped back to me, ignored"); + log_debug("rtmsg looped back to me, ignored"); #endif - continue; - } - break; + return; } - memset(&rta, 0, sizeof(rta)); - for (i = 0; i < RTAX_MAX; i++) { - if (addrs & (1 << i)) { - rta[i] = (struct sockaddr_in6 *)q; - q += ROUNDUP(rta[i]->sin6_len); - } + break; + } + memset(&rta, 0, sizeof(rta)); + for (i = 0; i < RTAX_MAX; i++) { + if (addrs & (1 << i)) { + rta[i] = (struct sockaddr_in6 *)q; + q += ROUNDUP(rta[i]->sin6_len); } + } - log_debug("rtsock: %s (addrs=%x)", - rttypes((struct rt_msghdr *)p), addrs); - if (dflag >= 2) { - for (i = 0; - i < ((struct rt_msghdr *)p)->rtm_msglen; - i++) { - log_enqueue("%02x ", p[i] & 0xff); - if (i % 16 == 15) - log_debug(""); - } - log_debug(""); - } - /* - * Easy ones first. - * - * We may be able to optimize by using ifm->ifm_index or - * ifam->ifam_index. For simplicity we don't do that here. - */ - switch (((struct rt_msghdr *)p)->rtm_type) { - case RTM_NEWADDR: - case RTM_IFINFO: - iface++; - continue; - case RTM_ADD: - rtable++; - continue; - case RTM_LOSING: - case RTM_MISS: - case RTM_RESOLVE: - case RTM_GET: - case RTM_LOCK: - /* nothing to be done here */ - log_debug("\tnothing to be done, ignored"); - continue; + log_debug("rtsock: %s (addrs=%x)", + rttypes((struct rt_msghdr *)p), addrs); + if (dflag >= 2) { + for (i = 0; + i < ((struct rt_msghdr *)p)->rtm_msglen; + i++) { + log_enqueue("%02x ", p[i] & 0xff); + if (i % 16 == 15) + log_debug(""); } + log_debug(""); + } + /* + * Easy ones first. + * + * We may be able to optimize by using ifm->ifm_index or + * ifam->ifam_index. For simplicity we don't do that here. + */ + switch (((struct rt_msghdr *)p)->rtm_type) { + case RTM_NEWADDR: + case RTM_IFINFO: + iface++; + return; + case RTM_ADD: + rtable++; + return; + case RTM_LOSING: + case RTM_MISS: + case RTM_RESOLVE: + case RTM_GET: + case RTM_LOCK: + /* nothing to be done here */ + log_debug("\tnothing to be done, ignored"); + return; + } #if 0 - if (rta[RTAX_DST] == NULL) { - log_debug("\tno destination, ignored"); - continue; - } - if (rta[RTAX_DST]->sin6_family != AF_INET6) { - log_debug("\taf mismatch, ignored"); - continue; - } - if (IN6_IS_ADDR_LINKLOCAL(&rta[RTAX_DST]->sin6_addr)) { - log_debug("\tlinklocal destination, ignored"); - continue; - } - if (IN6_ARE_ADDR_EQUAL(&rta[RTAX_DST]->sin6_addr, &in6addr_loopback)) { - log_debug("\tloopback destination, ignored"); - continue; /* Loopback */ - } - if (IN6_IS_ADDR_MULTICAST(&rta[RTAX_DST]->sin6_addr)) { - log_debug("\tmulticast destination, ignored"); - continue; - } + if (rta[RTAX_DST] == NULL) { + log_debug("\tno destination, ignored"); + return; + } + if (rta[RTAX_DST]->sin6_family != AF_INET6) { + log_debug("\taf mismatch, ignored"); + return; + } + if (IN6_IS_ADDR_LINKLOCAL(&rta[RTAX_DST]->sin6_addr)) { + log_debug("\tlinklocal destination, ignored"); + return; + } + if (IN6_ARE_ADDR_EQUAL(&rta[RTAX_DST]->sin6_addr, &in6addr_loopback)) { + log_debug("\tloopback destination, ignored"); + return; /* Loopback */ + } + if (IN6_IS_ADDR_MULTICAST(&rta[RTAX_DST]->sin6_addr)) { + log_debug("\tmulticast destination, ignored"); + return; + } #endif - /* hard ones */ - switch (((struct rt_msghdr *)p)->rtm_type) { - case RTM_NEWADDR: - case RTM_IFINFO: - case RTM_ADD: - case RTM_LOSING: - case RTM_MISS: - case RTM_RESOLVE: - case RTM_GET: - case RTM_LOCK: - /* should already be handled */ - fatalx("rtrecv: never reach here"); - /*NOTREACHED*/ - case RTM_DELETE: - if (!rta[RTAX_DST] || !rta[RTAX_GATEWAY]) { - log_debug("\tsome of dst/gw/netmask are " - "unavailable, ignored"); - break; - } - if ((rtm->rtm_flags & RTF_HOST) != 0) { - mask.sin6_len = sizeof(mask); - memset(&mask.sin6_addr, 0xff, - sizeof(mask.sin6_addr)); - rta[RTAX_NETMASK] = &mask; - } else if (!rta[RTAX_NETMASK]) { - log_debug("\tsome of dst/gw/netmask are " - "unavailable, ignored"); - break; - } - if (rt_del(rta[RTAX_DST], rta[RTAX_GATEWAY], - rta[RTAX_NETMASK]) == 0) { - rtable++; /*just to be sure*/ - } + /* hard ones */ + switch (((struct rt_msghdr *)p)->rtm_type) { + case RTM_NEWADDR: + case RTM_IFINFO: + case RTM_ADD: + case RTM_LOSING: + case RTM_MISS: + case RTM_RESOLVE: + case RTM_GET: + case RTM_LOCK: + /* should already be handled */ + fatalx("rtrecv: never reach here"); + /*NOTREACHED*/ + case RTM_DELETE: + if (!rta[RTAX_DST] || !rta[RTAX_GATEWAY]) { + log_debug("\tsome of dst/gw/netmask are " + "unavailable, ignored"); break; - case RTM_CHANGE: - case RTM_REDIRECT: - log_debug("\tnot supported yet, ignored"); + } + if ((rtm->rtm_flags & RTF_HOST) != 0) { + mask.sin6_len = sizeof(mask); + memset(&mask.sin6_addr, 0xff, + sizeof(mask.sin6_addr)); + rta[RTAX_NETMASK] = &mask; + } else if (!rta[RTAX_NETMASK]) { + log_debug("\tsome of dst/gw/netmask are " + "unavailable, ignored"); break; - case RTM_DELADDR: - if (!rta[RTAX_NETMASK] || !rta[RTAX_IFA]) { - log_debug("\tno netmask or ifa given, ignored"); - break; - } - if (ifam->ifam_index < nindex2ifc) - ifcp = index2ifc[ifam->ifam_index]; - else - ifcp = NULL; - if (!ifcp) { - log_debug("\tinvalid ifam_index %d, ignored", - ifam->ifam_index); - break; - } - if (!rt_deladdr(ifcp, rta[RTAX_IFA], rta[RTAX_NETMASK])) - iface++; + } + if (rt_del(rta[RTAX_DST], rta[RTAX_GATEWAY], + rta[RTAX_NETMASK]) == 0) { + rtable++; /*just to be sure*/ + } + break; + case RTM_CHANGE: + case RTM_REDIRECT: + log_debug("\tnot supported yet, ignored"); + break; + case RTM_DELADDR: + if (!rta[RTAX_NETMASK] || !rta[RTAX_IFA]) { + log_debug("\tno netmask or ifa given, ignored"); break; } - + if (ifam->ifam_index < nindex2ifc) + ifcp = index2ifc[ifam->ifam_index]; + else + ifcp = NULL; + if (!ifcp) { + log_debug("\tinvalid ifam_index %d, ignored", + ifam->ifam_index); + break; + } + if (!rt_deladdr(ifcp, rta[RTAX_IFA], rta[RTAX_NETMASK])) + iface++; + break; } if (iface) { |