svn commit: r294629 - projects/vnet/sys/netinet
Bjoern A. Zeeb
bz at FreeBSD.org
Sat Jan 23 12:51:13 UTC 2016
Author: bz
Date: Sat Jan 23 12:51:12 2016
New Revision: 294629
URL: https://svnweb.freebsd.org/changeset/base/294629
Log:
Try to prevent an address (assoc) leak in one way or another when
sctp_initiate_iterator() fails.
Sponsored by: The FreeBSD Foundation
Modified:
projects/vnet/sys/netinet/sctputil.c
Modified: projects/vnet/sys/netinet/sctputil.c
==============================================================================
--- projects/vnet/sys/netinet/sctputil.c Sat Jan 23 12:50:02 2016 (r294628)
+++ projects/vnet/sys/netinet/sctputil.c Sat Jan 23 12:51:12 2016 (r294629)
@@ -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,21 @@ 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");
+ SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, EFAULT);
+ /* XXX-BZ 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);
+ } 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);
+ }
+ }
}
}
More information about the svn-src-projects
mailing list