aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet/sctputil.c
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2016-02-16 19:36:25 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2016-02-16 19:36:25 +0000
commit2b1c7de4d8dcf8afbe96dff74283c328ec5f0aff (patch)
tree40916b56ceaedfbf6cce282be08d0d85df57734b /sys/netinet/sctputil.c
parentae038fc3365b8c0ce20da455159f6fd4d8124f14 (diff)
downloadsrc-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.c18
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);
+ }
+ }
}
}