]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Handle canceled read during sending data over stats channel
authorOndřej Surý <ondrej@isc.org>
Thu, 8 Sep 2022 16:24:57 +0000 (18:24 +0200)
committerOndřej Surý <ondrej@isc.org>
Thu, 15 Sep 2022 08:29:37 +0000 (10:29 +0200)
An assertion failure would be triggered when the TCP connection
is canceled during sending the data back to the client.

Don't require the state to be `RECV` on non successful read to
gracefully handle canceled TCP connection during the SEND state of the
HTTPD channel.

lib/isc/httpd.c

index e4c7d716994a177a4c91781a1dcdd217d79c2f6a..ac31b9a23c746501a0f4003497c056db9e292606 100644 (file)
@@ -907,13 +907,14 @@ httpd_request(isc_nmhandle_t *handle, isc_result_t eresult,
 
        httpd = isc_nmhandle_getdata(handle);
 
-       REQUIRE(httpd->state == RECV);
        REQUIRE(httpd->handle == handle);
 
        if (eresult != ISC_R_SUCCESS) {
                goto cleanup_readhandle;
        }
 
+       REQUIRE(httpd->state == RECV);
+
        result = process_request(
                httpd, region == NULL ? &(isc_region_t){ NULL, 0 } : region,
                &buflen);
@@ -1200,7 +1201,6 @@ httpd_senddone(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
        isc_httpd_t *httpd = (isc_httpd_t *)arg;
 
        REQUIRE(VALID_HTTPD(httpd));
-       REQUIRE(httpd->state == SEND);
        REQUIRE(httpd->handle == handle);
 
        isc_buffer_free(&httpd->sendbuffer);
@@ -1227,6 +1227,8 @@ httpd_senddone(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
                goto cleanup_readhandle;
        }
 
+       REQUIRE(httpd->state == SEND);
+
        httpd->state = RECV;
        httpd->sendhandle = NULL;