From a0bb05faf6d6232c7520da2a6a3d87d632c9b52b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 18 Oct 2021 11:49:56 +0200 Subject: [PATCH 1/2] Lock dispatch when canceling connect When canceling pending connections, the disp->pending list was accessed unlocked. --- lib/dns/dispatch.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index 633915cd30..72adb35f84 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -1483,6 +1483,7 @@ dns_dispatch_getnext(dns_dispentry_t *resp) { void dns_dispatch_cancel(dns_dispentry_t **respp) { dns_dispentry_t *resp = NULL; + dns_dispatch_t *disp = NULL; REQUIRE(respp != NULL); @@ -1491,6 +1492,7 @@ dns_dispatch_cancel(dns_dispentry_t **respp) { REQUIRE(VALID_RESPONSE(resp)); + disp = resp->disp; resp->canceled = true; /* Connected UDP. */ @@ -1499,11 +1501,12 @@ dns_dispatch_cancel(dns_dispentry_t **respp) { goto done; } + LOCK(&disp->lock); /* TCP pending connection. */ if (ISC_LINK_LINKED(resp, plink)) { dns_dispentry_t *copy = resp; - ISC_LIST_UNLINK(resp->disp->pending, resp, plink); + ISC_LIST_UNLINK(disp->pending, resp, plink); if (resp->connected != NULL) { resp->connected(ISC_R_CANCELED, NULL, resp->arg); } @@ -1516,6 +1519,7 @@ dns_dispatch_cancel(dns_dispentry_t **respp) { * dns_dispatch_done(). */ dispentry_detach(©); + UNLOCK(&disp->lock); goto done; } @@ -1526,14 +1530,14 @@ dns_dispatch_cancel(dns_dispentry_t **respp) { * unless this is the last resp waiting. */ if (ISC_LINK_LINKED(resp, alink)) { - ISC_LIST_UNLINK(resp->disp->active, resp, alink); - if (ISC_LIST_EMPTY(resp->disp->active) && - resp->disp->handle != NULL) { - isc_nm_cancelread(resp->disp->handle); + ISC_LIST_UNLINK(disp->active, resp, alink); + if (ISC_LIST_EMPTY(disp->active) && disp->handle != NULL) { + isc_nm_cancelread(disp->handle); } else if (resp->response != NULL) { resp->response(ISC_R_CANCELED, NULL, resp->arg); } } + UNLOCK(&disp->lock); done: dns_dispatch_done(&resp); From 94496635ff4acd0016cbb24cf92dcf280952c6ea Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Mon, 18 Oct 2021 12:49:40 -0700 Subject: [PATCH 2/2] silence compiler warning Silence a warning about a signed/unsigned integer comparison. --- lib/dns/dispatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index 72adb35f84..f1301f76e2 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -1429,7 +1429,7 @@ dns_dispatch_add(dns_dispatch_t *disp, unsigned int options, void dispatch_getnext(dns_dispatch_t *disp, dns_dispentry_t *resp, int32_t timeout) { - REQUIRE(timeout <= UINT16_MAX); + REQUIRE(timeout <= (int32_t)UINT16_MAX); switch (disp->socktype) { case isc_socktype_udp: