From: Ondřej Surý Date: Tue, 28 Mar 2023 07:40:59 +0000 (+0200) Subject: Fix isc_nm_httpconnect to check for shuttindown condition X-Git-Tag: v9.19.12~54^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=665f8bb78d1439f18ff6e5e3ebef8728a4985f45;p=thirdparty%2Fbind9.git Fix isc_nm_httpconnect to check for shuttindown condition The isc_nm_httpconnect() would succeed even if the netmgr would be already shuttingdown. This has been fixed and the unit test has been updated to cope with fact that the handle would be NULL when isc_nm_httpconnect() returns with an error. --- diff --git a/lib/isc/netmgr/http.c b/lib/isc/netmgr/http.c index 65d57929f93..f4d29b1d3e2 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 1fbaaa7d374..9bdf18107e8 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; } - - isc_job_run(loopmgr, doh_connect_thread, connect_nm); - } - if (sends <= 0) { - isc_loopmgr_shutdown(loopmgr); + assert_true(eresult == ISC_R_SUCCESS); } + + isc_job_run(loopmgr, doh_connect_thread, connect_nm); + } + if (sends <= 0) { + isc_loopmgr_shutdown(loopmgr); } - isc_nmhandle_detach(&thandle); } static void