From: Ondřej Surý Date: Thu, 24 Nov 2022 14:03:23 +0000 (+0100) Subject: Be more resilient when destroying the httpd requests X-Git-Tag: v9.19.8~41^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8df29e37d99b7b94b15a306dcb2b7488c9a92ad;p=thirdparty%2Fbind9.git 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. --- diff --git a/lib/isc/httpd.c b/lib/isc/httpd.c index c91847088d7..039de4da1ab 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); }