]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix isc_nm_httpconnect to check for shuttindown condition
authorOndřej Surý <ondrej@isc.org>
Tue, 28 Mar 2023 07:40:59 +0000 (09:40 +0200)
committerOndřej Surý <ondrej@isc.org>
Wed, 29 Mar 2023 05:49:57 +0000 (05:49 +0000)
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.

lib/isc/netmgr/http.c
tests/isc/doh_test.c

index 65d57929f936b18cb9f64c31c7978a94bb4e02e1..f4d29b1d3e2705b70495745c52c766e1e0e9677c 100644 (file)
@@ -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;
index 1fbaaa7d37453480904bb6346f3e86a728c4fe9a..9bdf18107e89d9ee085312059a09dd11151e592b 100644 (file)
@@ -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