diff options
author | Michael Tuexen <tuexen@FreeBSD.org> | 2016-02-16 19:36:25 +0000 |
---|---|---|
committer | Michael Tuexen <tuexen@FreeBSD.org> | 2016-02-16 19:36:25 +0000 |
commit | 2b1c7de4d8dcf8afbe96dff74283c328ec5f0aff (patch) | |
tree | 40916b56ceaedfbf6cce282be08d0d85df57734b /sys/netinet/sctputil.c | |
parent | ae038fc3365b8c0ce20da455159f6fd4d8124f14 (diff) | |
download | src-2b1c7de4d8dcf8afbe96dff74283c328ec5f0aff.tar.gz src-2b1c7de4d8dcf8afbe96dff74283c328ec5f0aff.zip |
Improve the teardown of the SCTP stack.
Obtained from: bz@
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=295668
Diffstat (limited to 'sys/netinet/sctputil.c')
-rw-r--r-- | sys/netinet/sctputil.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index 4cf134bf733c..49001cc518f1 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -1470,7 +1470,9 @@ sctp_handle_addr_wq(void) if (asc->cnt == 0) { SCTP_FREE(asc, SCTP_M_ASC_IT); } else { - (void)sctp_initiate_iterator(sctp_asconf_iterator_ep, + int ret; + + ret = sctp_initiate_iterator(sctp_asconf_iterator_ep, sctp_asconf_iterator_stcb, NULL, /* No ep end for boundall */ SCTP_PCB_FLAGS_BOUNDALL, @@ -1478,6 +1480,20 @@ sctp_handle_addr_wq(void) SCTP_ASOC_ANY_STATE, (void *)asc, 0, sctp_asconf_iterator_end, NULL, 0); + if (ret) { + SCTP_PRINTF("Failed to initiate iterator for handle_addr_wq\n"); + /* Freeing if we are stopping or put back on the addr_wq. */ + if (SCTP_BASE_VAR(sctp_pcb_initialized) == 0) { + sctp_asconf_iterator_end(asc, 0); + } else { + SCTP_WQ_ADDR_LOCK(); + LIST_FOREACH(wi, &asc->list_of_work, sctp_nxt_addr) { + LIST_INSERT_HEAD(&SCTP_BASE_INFO(addr_wq), wi, sctp_nxt_addr); + } + SCTP_WQ_ADDR_UNLOCK(); + SCTP_FREE(asc, SCTP_M_ASC_IT); + } + } } } |