Hi, The variable swapping between inp, newinp and oldinpcb in syn_cache_get() is overly complicated. Simplify the code without functional change.
ok? bluhm Index: netinet/tcp_input.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_input.c,v retrieving revision 1.319 diff -u -p -r1.319 tcp_input.c --- netinet/tcp_input.c 9 Jun 2016 23:09:51 -0000 1.319 +++ netinet/tcp_input.c 26 Jun 2016 23:47:27 -0000 @@ -3627,7 +3627,7 @@ syn_cache_get(struct sockaddr *src, stru { struct syn_cache *sc; struct syn_cache_head *scp; - struct inpcb *inp = NULL; + struct inpcb *inp, *oldinp; struct tcpcb *tp = NULL; struct mbuf *am; int s; @@ -3670,7 +3670,8 @@ syn_cache_get(struct sockaddr *src, stru if (so == NULL) goto resetandabort; - inp = sotoinpcb(oso); + oldinp = sotoinpcb(oso); + inp = sotoinpcb(so); #ifdef IPSEC /* @@ -3678,30 +3679,18 @@ syn_cache_get(struct sockaddr *src, stru * from the old pcb. Ditto for any other * IPsec-related information. */ - { - struct inpcb *newinp = sotoinpcb(so); - memcpy(newinp->inp_seclevel, inp->inp_seclevel, - sizeof(inp->inp_seclevel)); - } + memcpy(inp->inp_seclevel, oldinp->inp_seclevel, + sizeof(oldinp->inp_seclevel)); #endif /* IPSEC */ #ifdef INET6 /* * inp still has the OLD in_pcb stuff, set the * v6-related flags on the new guy, too. */ - { - int flags = inp->inp_flags; - struct inpcb *oldinpcb = inp; - - inp = sotoinpcb(so); - inp->inp_flags |= (flags & INP_IPV6); - if ((inp->inp_flags & INP_IPV6) != 0) { - inp->inp_ipv6.ip6_hlim = - oldinpcb->inp_ipv6.ip6_hlim; - } + inp->inp_flags |= (oldinp->inp_flags & INP_IPV6); + if (ISSET(inp->inp_flags, INP_IPV6)) { + inp->inp_ipv6.ip6_hlim = oldinp->inp_ipv6.ip6_hlim; } -#else /* INET6 */ - inp = sotoinpcb(so); #endif /* INET6 */ #if NPF > 0