diff --git a/lib/isc/netmgr/http.c b/lib/isc/netmgr/http.c index 65d57929f9..f4d29b1d3e 100644 --- a/lib/isc/netmgr/http.c +++ b/lib/isc/netmgr/http.c @@ -1464,6 +1464,11 @@ isc_nm_httpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer, REQUIRE(uri != NULL); REQUIRE(*uri != '\0'); + if (isc__nm_closing(worker)) { + cb(NULL, ISC_R_SHUTTINGDOWN, cbarg); + return; + } + if (local == NULL) { isc_sockaddr_anyofpf(&local_interface, peer->type.sa.sa_family); local = &local_interface; diff --git a/tests/isc/doh_test.c b/tests/isc/doh_test.c index 1fbaaa7d37..9bdf18107e 100644 --- a/tests/isc/doh_test.c +++ b/tests/isc/doh_test.c @@ -134,8 +134,6 @@ static void connect_send_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) { csdata_t data; - REQUIRE(VALID_NMHANDLE(handle)); - (void)atomic_fetch_sub(&active_cconnects, 1); memmove(&data, arg, sizeof(data)); isc_mem_put(data.mctx, arg, sizeof(data)); @@ -143,6 +141,8 @@ connect_send_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) { goto error; } + REQUIRE(VALID_NMHANDLE(handle)); + result = isc__nm_http_request(handle, &data.region, data.reply_cb, data.cb_arg); if (result != ISC_R_SUCCESS) { @@ -675,39 +675,38 @@ doh_connect_thread(void *arg); static void doh_receive_send_reply_cb(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, void *cbarg) { - isc_nmhandle_t *thandle = NULL; isc_nm_t *connect_nm = (isc_nm_t *)cbarg; + if (eresult != ISC_R_SUCCESS) { + return; + } + assert_non_null(handle); UNUSED(region); - isc_nmhandle_attach(handle, &thandle); - if (eresult == ISC_R_SUCCESS) { - int_fast64_t sends = atomic_fetch_sub(&nsends, 1); - atomic_fetch_add(&csends, 1); - atomic_fetch_add(&creads, 1); - if (sends > 0 && connect_nm != NULL) { - size_t i; - for (i = 0; i < NWRITES / 2; i++) { - eresult = isc__nm_http_request( - handle, - &(isc_region_t){ - .base = (uint8_t *)send_msg.base, - .length = send_msg.len }, - doh_receive_send_reply_cb, NULL); - if (eresult == ISC_R_CANCELED) { - break; - } - assert_true(eresult == ISC_R_SUCCESS); + int_fast64_t sends = atomic_fetch_sub(&nsends, 1); + atomic_fetch_add(&csends, 1); + atomic_fetch_add(&creads, 1); + if (sends > 0 && connect_nm != NULL) { + size_t i; + for (i = 0; i < NWRITES / 2; i++) { + eresult = isc__nm_http_request( + handle, + &(isc_region_t){ + .base = (uint8_t *)send_msg.base, + .length = send_msg.len }, + doh_receive_send_reply_cb, NULL); + if (eresult == ISC_R_CANCELED) { + break; } + assert_true(eresult == ISC_R_SUCCESS); + } - isc_job_run(loopmgr, doh_connect_thread, connect_nm); - } - if (sends <= 0) { - isc_loopmgr_shutdown(loopmgr); - } + isc_job_run(loopmgr, doh_connect_thread, connect_nm); + } + if (sends <= 0) { + isc_loopmgr_shutdown(loopmgr); } - isc_nmhandle_detach(&thandle); } static void