Fix a race condition on tcp listen socket teardown with pending

connections in the accept queue and contiguous new incoming SYNs.

Compared to the original submitters patch I've moved the test
next to the SYN handling to have it together in a logical unit
and reworded the comment explaining the issue.

Submitted by:	Matt Miller <matt@matthewjmiller.net>
Submitted by:	Juan Mojica <jmojica@gmail.com>
Reviewed by:	Matt Miller (changes)
Tested by:	pho
MFC after:	1 week
This commit is contained in:
Andre Oppermann 2013-04-09 20:52:26 +00:00
parent a3058216b5
commit 982c1675ff

View File

@ -1405,6 +1405,15 @@ relocked:
*/
INP_INFO_UNLOCK_ASSERT(&V_tcbinfo);
return;
} else if (tp->t_state == TCPS_LISTEN) {
/*
* When a listen socket is torn down the SO_ACCEPTCONN
* flag is removed first while connections are drained
* from the accept queue in a unlock/lock cycle of the
* ACCEPT_LOCK, opening a race condition allowing a SYN
* attempt go through unhandled.
*/
goto dropunlock;
}
#ifdef TCP_SIGNATURE