From 57a568e8f9645a464e23d810c8536e4768c6eded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ondr=CC=8Cej=20Sury=CC=81?= Date: Thu, 27 Jul 2023 11:31:06 +0200 Subject: [PATCH 1/3] Unify the naming for struct stub_glue_request The stub_request_nameserver_address() used 'request' as name for struct stub_glue_request leading to confusion between 'request' (stub_glue_request) and 'request->request' (dns_request_t). Unify the name to 'sgr' already used in struct stub_glue_response(). --- lib/dns/zone.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 8e2416a171..dfbdb66040 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -12906,19 +12906,19 @@ stub_request_nameserver_address(struct stub_cb_args *args, bool ipv4, dns_message_t *message = NULL; dns_zone_t *zone; isc_result_t result; - struct stub_glue_request *request; + struct stub_glue_request *sgr; isc_sockaddr_t curraddr; zone = args->stub->zone; - request = isc_mem_get(zone->mctx, sizeof(*request)); - request->request = NULL; - request->args = args; - request->name = (dns_name_t)DNS_NAME_INITEMPTY; - request->ipv4 = ipv4; - dns_name_dup(name, zone->mctx, &request->name); + sgr = isc_mem_get(zone->mctx, sizeof(*sgr)); + sgr->request = NULL; + sgr->args = args; + sgr->name = (dns_name_t)DNS_NAME_INITEMPTY; + sgr->ipv4 = ipv4; + dns_name_dup(name, zone->mctx, &sgr->name); create_query(zone, ipv4 ? dns_rdatatype_a : dns_rdatatype_aaaa, - &request->name, &message); + &sgr->name, &message); if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOEDNS)) { result = add_opt(message, args->udpsize, args->reqnsid, false); @@ -12937,7 +12937,7 @@ stub_request_nameserver_address(struct stub_cb_args *args, bool ipv4, zone->view->requestmgr, message, &zone->sourceaddr, &curraddr, NULL, NULL, DNS_REQUESTOPT_TCP, args->tsig_key, args->timeout * 3, args->timeout, 2, zone->loop, - stub_glue_response, request, &request->request); + stub_glue_response, sgr, &sgr->request); if (result != ISC_R_SUCCESS) { uint_fast32_t pr; @@ -12954,8 +12954,8 @@ stub_request_nameserver_address(struct stub_cb_args *args, bool ipv4, return (ISC_R_SUCCESS); fail: - dns_name_free(&request->name, zone->mctx); - isc_mem_put(zone->mctx, request, sizeof(*request)); + dns_name_free(&sgr->name, zone->mctx); + isc_mem_put(zone->mctx, sgr, sizeof(*sgr)); if (message != NULL) { dns_message_detach(&message); From 31c43d4b76b11e99d667dd035a85b716762e40a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ondr=CC=8Cej=20Sury=CC=81?= Date: Thu, 27 Jul 2023 11:31:06 +0200 Subject: [PATCH 2/3] Free struct stub_glue_request in stub_glue_response() callback When stub_glue_response() is called, the associated data is stored in newly allocated struct stub_glue_request. The allocated structure is never freed in the callback, thus we leak a little bit of memory. --- lib/dns/zone.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index dfbdb66040..e499444a93 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -12880,6 +12880,7 @@ cleanup: } dns_name_free(&sgr->name, zone->mctx); dns_request_destroy(&request); + isc_mem_put(zone->mctx, sgr, sizeof(*sgr)); /* If last request, release all related resources */ if (atomic_fetch_sub_release(&stub->pending_requests, 1) == 1) { From 7a2b4ad17bc52913ab5817f60c6ada201145dde3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ondr=CC=8Cej=20Sury=CC=81?= Date: Thu, 27 Jul 2023 11:33:22 +0200 Subject: [PATCH 3/3] Add CHANGES note for [GL #4227] --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index fb6684b136..12953a3c5c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +6214. [bug] Fix the memory leak in for struct stub_glue_request + allocated in stub_request_nameserver_address() but not + freed in stub_glue_response(). [GL #4227] + 6213. [bug] Mark a primary server as temporarily unreachable if the TCP connection attempt times out. [GL #4215]