Index: tcp_input.c =================================================================== RCS file: /cvsroot/src/sys/netinet/tcp_input.c,v retrieving revision 1.357.4.3 diff -u -p -u -r1.357.4.3 tcp_input.c --- tcp_input.c 30 Mar 2018 11:17:19 -0000 1.357.4.3 +++ tcp_input.c 7 Jul 2020 11:28:09 -0000 @@ -1273,16 +1273,32 @@ tcp_input(struct mbuf *m, ...) #endif /* + * Enforce alignment requirements that are violated in + * some cases, see kern/50766 for details. + */ + if (TCP_HDR_ALIGNED_P(th) == 0) { + m = m_copyup(m, toff + sizeof(struct tcphdr), 0); + if (m == NULL) { + TCP_STATINC(TCP_STAT_RCVSHORT); + return; + } + th = (struct tcphdr *)(mtod(m, char *) + toff); + } + KASSERT(TCP_HDR_ALIGNED_P(th)); + + /* * Get IP and TCP header. * Note: IP leaves IP header in first mbuf. */ +#ifdef INET6 + ip6 = mtod(m, struct ip6_hdr *); +#endif +#ifdef INET ip = mtod(m, struct ip *); +#endif switch (ip->ip_v) { #ifdef INET case 4: -#ifdef INET6 - ip6 = NULL; -#endif af = AF_INET; iphlen = sizeof(struct ip); IP6_EXTHDR_GET(th, struct tcphdr *, m, toff, @@ -1299,10 +1315,8 @@ tcp_input(struct mbuf *m, ...) #endif #ifdef INET6 case 6: - ip = NULL; iphlen = sizeof(struct ip6_hdr); af = AF_INET6; - ip6 = mtod(m, struct ip6_hdr *); IP6_EXTHDR_GET(th, struct tcphdr *, m, toff, sizeof(struct tcphdr)); if (th == NULL) { @@ -1349,23 +1363,6 @@ tcp_input(struct mbuf *m, ...) m_freem(m); return; } - /* - * Enforce alignment requirements that are violated in - * some cases, see kern/50766 for details. - */ - if (TCP_HDR_ALIGNED_P(th) == 0) { - m = m_copyup(m, toff + sizeof(struct tcphdr), 0); - if (m == NULL) { - TCP_STATINC(TCP_STAT_RCVSHORT); - return; - } - ip = mtod(m, struct ip *); -#ifdef INET6 - ip6 = mtod(m, struct ip6_hdr *); -#endif - th = (struct tcphdr *)(mtod(m, char *) + toff); - } - KASSERT(TCP_HDR_ALIGNED_P(th)); /* * Check that TCP offset makes sense, @@ -1601,7 +1598,6 @@ findpcb: m_freem(in6p->in6p_options); in6p->in6p_options = 0; } - KASSERT(ip6 != NULL); ip6_savecontrol(in6p, &in6p->in6p_options, ip6, m); } #endif