diff options
Diffstat (limited to 'sys/netinet6/route6.c')
-rw-r--r-- | sys/netinet6/route6.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/netinet6/route6.c b/sys/netinet6/route6.c index 4c488cba5f4a..72e42084eacc 100644 --- a/sys/netinet6/route6.c +++ b/sys/netinet6/route6.c @@ -83,11 +83,13 @@ route6_input(struct mbuf **mp, int *offp, int proto) } #endif - m = m_pullup(m, off + sizeof(*rh)); - if (m == NULL) { - IP6STAT_INC(ip6s_exthdrtoolong); - *mp = NULL; - return (IPPROTO_DONE); + if (m->m_len < off + sizeof(*rh)) { + m = m_pullup(m, off + sizeof(*rh)); + if (m == NULL) { + IP6STAT_INC(ip6s_exthdrtoolong); + *mp = NULL; + return (IPPROTO_DONE); + } } ip6 = mtod(m, struct ip6_hdr *); rh = (struct ip6_rthdr *)((caddr_t)ip6 + off); |