MFC of 202523

This fixes a closing race condition that is unlikely
to ever happen.. but good to fix ;-)
This commit is contained in:
Randall Stewart 2010-04-17 03:51:13 +00:00
parent 57f0b741c6
commit 9eb2a664ab

View File

@ -551,6 +551,7 @@ sctp_attach(struct socket *so, int proto, struct thread *p)
sctp_log_closing(inp, NULL, 17);
#endif
if (error != 0) {
try_again:
flags = inp->sctp_flags;
if (((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) &&
(atomic_cmpset_int(&inp->sctp_flags, flags, (flags | SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_CLOSE_IP)))) {
@ -561,7 +562,12 @@ sctp_attach(struct socket *so, int proto, struct thread *p)
sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT,
SCTP_CALLED_AFTER_CMPSET_OFCLOSE);
} else {
SCTP_INP_WUNLOCK(inp);
flags = inp->sctp_flags;
if ((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) {
goto try_again;
} else {
SCTP_INP_WUNLOCK(inp);
}
}
return error;
}