There was a race in the TCP timers. As they may sleep to grab the
authorbluhm <bluhm@openbsd.org>
Tue, 6 Feb 2018 15:13:08 +0000 (15:13 +0000)
committerbluhm <bluhm@openbsd.org>
Tue, 6 Feb 2018 15:13:08 +0000 (15:13 +0000)
commitded1556fba39d5de057bbd6b1c756135fcfec288
tree506c0cea39c5a69ebf8c10dc394c1bc2f7e79941
parentdeedd948db27d7042654622a9c7747c53fe0ab79
There was a race in the TCP timers.  As they may sleep to grab the
netlock, timers may still run after they have been disarmed.  Deleting
the timeout is not sufficient to cancel them, but the code from 4.4
BSD is assuming this.
The solution is to add a flag for every timer to see whether it has
been armed or canceled.  Remove the TF_DEAD check as tcp_canceltimers()
is called before the reaper timer is fired.  Cancelation works
reliably now.
OK mpi@
sys/netinet/tcp_timer.c
sys/netinet/tcp_timer.h
sys/netinet/tcp_var.h