diff options
| author | Andrew Gallatin <gallatin@FreeBSD.org> | 2020-05-12 17:18:44 +0000 |
|---|---|---|
| committer | Andrew Gallatin <gallatin@FreeBSD.org> | 2020-05-12 17:18:44 +0000 |
| commit | bc74b819918a5429f833804646cde1f72d398ab8 (patch) | |
| tree | cc983618894fa982343c941914b84b6842738807 /sys/netinet6 | |
| parent | cf5537182738ceb2822a2b1daaaf38b091ac3fd6 (diff) | |
Notes
Diffstat (limited to 'sys/netinet6')
| -rw-r--r-- | sys/netinet6/nd6.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index e13b08ee32cf2..57009fba58866 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -821,9 +821,27 @@ nd6_llinfo_timer(void *arg) clear_llinfo_pqueue(ln); } nd6_free(&ln, 0); - if (m != NULL) - icmp6_error2(m, ICMP6_DST_UNREACH, - ICMP6_DST_UNREACH_ADDR, 0, ifp); + if (m != NULL) { + struct mbuf *n = m; + + /* + * if there are any ummapped mbufs, we + * must free them, rather than using + * them for an ICMP, as they cannot be + * checksummed. + */ + while ((n = n->m_next) != NULL) { + if (n->m_flags & M_EXTPG) + break; + } + if (n != NULL) { + m_freem(m); + m = NULL; + } else { + icmp6_error2(m, ICMP6_DST_UNREACH, + ICMP6_DST_UNREACH_ADDR, 0, ifp); + } + } } break; case ND6_LLINFO_REACHABLE: |
