mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-13 21:09:59 -04:00
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.
This commit is contained in:
parent
9317aa9608
commit
665f8bb78d
2 changed files with 31 additions and 27 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue