MFC of 202523
This fixes a closing race condition that is unlikely to ever happen.. but good to fix ;-)
This commit is contained in:
parent
57f0b741c6
commit
9eb2a664ab
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user