Index: sys/netinet/cc/cc_cdg.c =================================================================== --- sys/netinet/cc/cc_cdg.c +++ sys/netinet/cc/cc_cdg.c @@ -337,6 +337,8 @@ struct qdiff_sample *qds, *qds_n; cdg_data = ccv->cc_data; + if (cdg_data == NULL) + return; qds = STAILQ_FIRST(&cdg_data->qdiffmin_q); while (qds != NULL) { @@ -353,6 +355,7 @@ } free(ccv->cc_data, M_CDG); + ccv->cc_data = NULL; } static int Index: sys/netinet/cc/cc_chd.c =================================================================== --- sys/netinet/cc/cc_chd.c +++ sys/netinet/cc/cc_chd.c @@ -307,8 +307,8 @@ chd_cb_destroy(struct cc_var *ccv) { - if (ccv->cc_data != NULL) - free(ccv->cc_data, M_CHD); + free(ccv->cc_data, M_CHD); + ccv->cc_data = NULL; } static int Index: sys/netinet/cc/cc_cubic.c =================================================================== --- sys/netinet/cc/cc_cubic.c +++ sys/netinet/cc/cc_cubic.c @@ -213,9 +213,8 @@ static void cubic_cb_destroy(struct cc_var *ccv) { - - if (ccv->cc_data != NULL) - free(ccv->cc_data, M_CUBIC); + free(ccv->cc_data, M_CUBIC); + ccv->cc_data = NULL; } static int Index: sys/netinet/cc/cc_dctcp.c =================================================================== --- sys/netinet/cc/cc_dctcp.c +++ sys/netinet/cc/cc_dctcp.c @@ -184,8 +184,8 @@ static void dctcp_cb_destroy(struct cc_var *ccv) { - if (ccv->cc_data != NULL) - free(ccv->cc_data, M_dctcp); + free(ccv->cc_data, M_dctcp); + ccv->cc_data = NULL; } static int Index: sys/netinet/cc/cc_htcp.c =================================================================== --- sys/netinet/cc/cc_htcp.c +++ sys/netinet/cc/cc_htcp.c @@ -238,9 +238,8 @@ static void htcp_cb_destroy(struct cc_var *ccv) { - - if (ccv->cc_data != NULL) - free(ccv->cc_data, M_HTCP); + free(ccv->cc_data, M_HTCP); + ccv->cc_data = NULL; } static int Index: sys/netinet/cc/cc_newreno.c =================================================================== --- sys/netinet/cc/cc_newreno.c +++ sys/netinet/cc/cc_newreno.c @@ -127,9 +127,8 @@ static void newreno_cb_destroy(struct cc_var *ccv) { - - if (ccv->cc_data != NULL) - free(ccv->cc_data, M_NEWRENO); + free(ccv->cc_data, M_NEWRENO); + ccv->cc_data = NULL; } static void Index: sys/netinet/cc/cc_vegas.c =================================================================== --- sys/netinet/cc/cc_vegas.c +++ sys/netinet/cc/cc_vegas.c @@ -170,9 +170,8 @@ static void vegas_cb_destroy(struct cc_var *ccv) { - - if (ccv->cc_data != NULL) - free(ccv->cc_data, M_VEGAS); + free(ccv->cc_data, M_VEGAS); + ccv->cc_data = NULL; } static int Index: sys/netinet/tcp_subr.c =================================================================== --- sys/netinet/tcp_subr.c +++ sys/netinet/tcp_subr.c @@ -1730,10 +1730,15 @@ */ if (CC_ALGO(tp) == unload_algo) { tmpalgo = CC_ALGO(tp); - /* NewReno does not require any init. */ - CC_ALGO(tp) = &newreno_cc_algo; if (tmpalgo->cb_destroy != NULL) tmpalgo->cb_destroy(tp->ccv); + KASSERT(CC_DATA(tp) == NULL, + ("cc should have nullified ", + "cc_data in %s", __func__)); + /* NewReno shall internally init cc_data + * if ABE sockopt is re-called. + */ + CC_ALGO(tp) = &newreno_cc_algo; } } INP_WUNLOCK(inp); @@ -1885,6 +1890,8 @@ /* Allow the CC algorithm to clean up after itself. */ if (CC_ALGO(tp)->cb_destroy != NULL) CC_ALGO(tp)->cb_destroy(tp->ccv); + KASSERT(CC_DATA(tp) == NULL, ("cc should have nullified cc_data in %s", + __func__)); #ifdef TCP_HHOOK khelp_destroy_osd(tp->osd); Index: sys/netinet/tcp_usrreq.c =================================================================== --- sys/netinet/tcp_usrreq.c +++ sys/netinet/tcp_usrreq.c @@ -1729,6 +1729,8 @@ */ if (CC_ALGO(tp)->cb_destroy != NULL) CC_ALGO(tp)->cb_destroy(tp->ccv); + KASSERT(CC_DATA(tp) == NULL, ("cc should have ", + "nullified cc_data in %s", __func__)); CC_ALGO(tp) = algo; /* * If something goes pear shaped initialising the new