diff options
Diffstat (limited to 'sys/netinet6/icmp6.c')
| -rw-r--r-- | sys/netinet6/icmp6.c | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c index 421280690c9..9567e5cc4fd 100644 --- a/sys/netinet6/icmp6.c +++ b/sys/netinet6/icmp6.c @@ -1,4 +1,4 @@ -/* $OpenBSD: icmp6.c,v 1.219 2017/10/18 17:01:14 bluhm Exp $ */ +/* $OpenBSD: icmp6.c,v 1.220 2017/11/03 14:28:57 florian Exp $ */ /* $KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $ */ /* @@ -637,32 +637,23 @@ icmp6_input(struct mbuf **mp, int *offp, int proto, int af) break; case ND_ROUTER_SOLICIT: - if (code != 0) - goto badcode; - if (icmp6len < sizeof(struct nd_router_solicit)) - goto badlen; - if ((n = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) == NULL) { - /* give up local */ - nd6_rs_input(m, off, icmp6len); - m = NULL; - goto freeit; - } - nd6_rs_input(n, off, icmp6len); - /* m stays. */ - break; - case ND_ROUTER_ADVERT: if (code != 0) goto badcode; - if (icmp6len < sizeof(struct nd_router_advert)) + if ((icmp6->icmp6_type == ND_ROUTER_SOLICIT && icmp6len < + sizeof(struct nd_router_solicit)) || + (icmp6->icmp6_type == ND_ROUTER_ADVERT && icmp6len < + sizeof(struct nd_router_advert))) goto badlen; + if ((n = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) == NULL) { /* give up local */ - nd6_ra_input(m, off, icmp6len); + nd6_rtr_cache(m, off, icmp6len, + icmp6->icmp6_type); m = NULL; goto freeit; } - nd6_ra_input(n, off, icmp6len); + nd6_rtr_cache(n, off, icmp6len, icmp6->icmp6_type); /* m stays. */ break; |
