]> git.kaiwu.me - haproxy.git/commitdiff
CLEANUP: dns: centralize nameserver transport cleanup
authorManu Nicolas <e.nicolas@criteo.com>
Tue, 18 Aug 2026 17:24:48 +0000 (17:24 +0000)
committerWilly Tarreau <w@1wt.eu>
Wed, 19 Aug 2026 09:19:51 +0000 (11:19 +0200)
Several resolver configuration error paths open-code nameserver
transport cleanup. They also assume that a nameserver owns either a
datagram transport or a stream transport, but never both.

Add dns_nameserver_deinit() and use it from these error paths. The
helper releases each transport's configuration-time allocations
independently and clears its pointer. No functional change is intended.

include/haproxy/dns.h
src/dns.c
src/resolvers.c

index 84181c43d633a16d846d40d92a3a2da3cfc7a7de..3e0cd59391d329468eb94f58cdd3e395e856d7ff 100644 (file)
@@ -29,5 +29,6 @@ int dns_send_nameserver(struct dns_nameserver *ns, void *buf, size_t len);
 ssize_t dns_recv_nameserver(struct dns_nameserver *ns, void *data, size_t size);
 int dns_dgram_init(struct dns_nameserver *ns, struct sockaddr_storage *sk);
 int dns_stream_init(struct dns_nameserver *ns, struct server *s);
+void dns_nameserver_deinit(struct dns_nameserver *ns);
 
 #endif // _HAPROXY_DNS_H
index 50f6e8ae0669697f8a99a94cba4efe0533f0e3c6..53e71de0ec375f7a1bdbb77a411f156f3d97c284 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -1417,6 +1417,25 @@ out:
        return -1;
 }
 
+/* Releases transport allocations owned by <ns>. */
+void dns_nameserver_deinit(struct dns_nameserver *ns)
+{
+       if (ns->dgram) {
+               dns_ring_free(ns->dgram->ring_req);
+               free(ns->dgram);
+               ns->dgram = NULL;
+       }
+
+       if (ns->stream) {
+               dns_ring_free(ns->stream->ring_req);
+               task_destroy(ns->stream->task_req);
+               task_destroy(ns->stream->task_rsp);
+               task_destroy(ns->stream->task_idle);
+               free(ns->stream);
+               ns->stream = NULL;
+       }
+}
+
 int init_dns_buffers()
 {
        dns_msg_trash = malloc(DNS_TCP_MSG_MAX_SIZE);
index 65612ab9230248f112a5ad1042a377ddd2e27e48..06fb19c415ead3a6350f3c62c435969ec03d8213 100644 (file)
@@ -3590,8 +3590,7 @@ static int parse_resolve_conf(char **errmsg, char **warnmsg)
                        if (errmsg)
                                memprintf(errmsg, "parsing [/etc/resolv.conf:%d] : out of memory.", resolv_linenum);
                        err_code |= ERR_ALERT | ERR_FATAL;
-                       dns_ring_free(newnameserver->dgram->ring_req);
-                       free(newnameserver->dgram);
+                       dns_nameserver_deinit(newnameserver);
                        free(newnameserver);
                        goto resolv_out;
                }
@@ -3602,8 +3601,7 @@ static int parse_resolve_conf(char **errmsg, char **warnmsg)
                                memprintf(errmsg, "parsing [/etc/resolv.conf:%d] : out of memory.", resolv_linenum);
                        err_code |= ERR_ALERT | ERR_FATAL;
                        free((char *)newnameserver->conf.file);
-                       dns_ring_free(newnameserver->dgram->ring_req);
-                       free(newnameserver->dgram);
+                       dns_nameserver_deinit(newnameserver);
                        free(newnameserver);
                        goto resolv_out;
                }
@@ -3822,16 +3820,7 @@ int cfg_parse_resolvers(const char *file, int linenum, char **args, int kwm)
                if ((newnameserver->conf.file = strdup(file)) == NULL) {
                        ha_alert("parsing [%s:%d] : out of memory.\n", file, linenum);
                        err_code |= ERR_ALERT | ERR_ABORT;
-                       if (newnameserver->stream) {
-                               dns_ring_free(newnameserver->stream->ring_req);
-                               task_destroy(newnameserver->stream->task_req);
-                               task_destroy(newnameserver->stream->task_rsp);
-                               task_destroy(newnameserver->stream->task_idle);
-                               free(newnameserver->stream);
-                       } else if (newnameserver->dgram) {
-                               dns_ring_free(newnameserver->dgram->ring_req);
-                               free(newnameserver->dgram);
-                       }
+                       dns_nameserver_deinit(newnameserver);
                        free(newnameserver);
                        goto out;
                }
@@ -3840,16 +3829,7 @@ int cfg_parse_resolvers(const char *file, int linenum, char **args, int kwm)
                        ha_alert("parsing [%s:%d] : out of memory.\n", file, linenum);
                        err_code |= ERR_ALERT | ERR_ABORT;
                        free((char *)newnameserver->conf.file);
-                       if (newnameserver->stream) {
-                               dns_ring_free(newnameserver->stream->ring_req);
-                               task_destroy(newnameserver->stream->task_req);
-                               task_destroy(newnameserver->stream->task_rsp);
-                               task_destroy(newnameserver->stream->task_idle);
-                               free(newnameserver->stream);
-                       } else if (newnameserver->dgram) {
-                               dns_ring_free(newnameserver->dgram->ring_req);
-                               free(newnameserver->dgram);
-                       }
+                       dns_nameserver_deinit(newnameserver);
                        free(newnameserver);
                        goto out;
                }