From d8df29e37d99b7b94b15a306dcb2b7488c9a92ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Thu, 24 Nov 2022 15:03:23 +0100 Subject: [PATCH 1/2] Be more resilient when destroying the httpd requests Don't restart reading in the send callback after the httpdmgr has been shut down, and call httpd_request(..., ISC_R_SHUTDOWN, ...) when shutting down the httpdmgr to reduce code duplication. --- lib/isc/httpd.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/isc/httpd.c b/lib/isc/httpd.c index c91847088d..039de4da1a 100644 --- a/lib/isc/httpd.c +++ b/lib/isc/httpd.c @@ -899,14 +899,16 @@ httpd_request(isc_nmhandle_t *handle, isc_result_t eresult, REQUIRE(VALID_HTTPD(httpd)); REQUIRE(httpd->handle == handle); - REQUIRE(httpd->readhandle == handle); - - isc_nm_read_stop(httpd->readhandle); if (eresult != ISC_R_SUCCESS) { goto close_readhandle; } + REQUIRE(httpd->readhandle == handle); + REQUIRE((mgr->flags & ISC_HTTPDMGR_SHUTTINGDOWN) == 0); + + isc_nm_read_stop(httpd->readhandle); + /* * If we are being called from httpd_senddone(), the last HTTP request * was processed successfully, reset the last_len to 0, even if there's @@ -955,6 +957,7 @@ httpd_request(isc_nmhandle_t *handle, isc_result_t eresult, return; close_readhandle: + isc_nm_read_stop(httpd->readhandle); isc_nmhandle_close(httpd->readhandle); isc_nmhandle_detach(&httpd->readhandle); } @@ -977,8 +980,10 @@ isc_httpdmgr_shutdown(isc_httpdmgr_t **httpdmgrp) { httpd = ISC_LIST_HEAD(httpdmgr->running); while (httpd != NULL) { - isc_nm_read_stop(httpd->readhandle); - isc_nmhandle_detach(&httpd->readhandle); + if (httpd->readhandle != NULL) { + httpd_request(httpd->readhandle, ISC_R_SHUTTINGDOWN, + NULL, httpdmgr); + } httpd = ISC_LIST_NEXT(httpd, link); } UNLOCK(&httpdmgr->lock); @@ -1038,6 +1043,10 @@ httpd_senddone(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) { REQUIRE(VALID_HTTPD(httpd)); + if ((httpd->mgr->flags & ISC_HTTPDMGR_SHUTTINGDOWN) != 0) { + goto detach; + } + if (eresult == ISC_R_SUCCESS && (httpd->flags & HTTPD_CLOSE) == 0) { /* * Calling httpd_request() with region NULL restarts @@ -1049,8 +1058,8 @@ httpd_senddone(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) { isc_nmhandle_close(handle); } +detach: isc_nmhandle_detach(&handle); - isc__httpd_sendreq_free(req); } From 32e0df2a13ebf3eaf3c76a3df663187011e3d793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Wed, 23 Nov 2022 14:23:40 +0100 Subject: [PATCH 2/2] Add CHANGES and release note for [GL #3693] --- CHANGES | 5 +++++ doc/notes/notes-current.rst | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/CHANGES b/CHANGES index 80f83cb891..cf143a47ea 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +6027. [bug] Fix assertion failure in isc_http API used by + statschannel if the read callback would be called + on HTTP request that has been already closed. + [GL #3693] + 6026. [cleanup] Deduplicate time unit conversion factors. [GL !7033] diff --git a/doc/notes/notes-current.rst b/doc/notes/notes-current.rst index 12eca88597..0397ae0329 100644 --- a/doc/notes/notes-current.rst +++ b/doc/notes/notes-current.rst @@ -52,9 +52,13 @@ Bug Fixes 10 to 100 to accomodate for some browsers that send more that 10 headers by default. :gl:`#3670` + - Copy TLS identifier when setting up primaries for catalog member zones. :gl:`#3638` +- Fix an assertion failure in the statschannel caused by reading from the HTTP + connection closed prematurely (connection error, shutdown). :gl:`#3693` + Known Issues ~~~~~~~~~~~~