mirror of
https://github.com/haproxy/haproxy.git
synced 2026-11-04 14:59:44 +00:00
CLEANUP: dns: centralize nameserver transport cleanup
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.
This commit is contained in:
1 parent
70e4074434
commit
ba8ccfeddc
3 files changed
+24
-24
No files matched your search
@@ -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
|
||||
@@ -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);
|
||||
|
||||
+4
-24
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user