From db46d4d38bec59435a76bb0968d530b9426c551e Mon Sep 17 00:00:00 2001 From: Heiko Hund Date: Fri, 13 Dec 2024 17:46:30 +0100 Subject: [PATCH] dns: clone options via pointer instead of copy Change-Id: I12b8bb26c0cb70e50b2d42b1c69018894e9f080c Signed-off-by: Heiko Hund Acked-by: Frank Lichtenheld Message-Id: <20241213164630.266045-1-frank@lichtenheld.com> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg30112.html Signed-off-by: Gert Doering --- src/openvpn/dns.c | 10 ++++++---- src/openvpn/dns.h | 3 ++- src/openvpn/options.c | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/openvpn/dns.c b/src/openvpn/dns.c index 15e73223a0d..e22ea0071cc 100644 --- a/src/openvpn/dns.c +++ b/src/openvpn/dns.c @@ -248,13 +248,15 @@ clone_dns_servers(const struct dns_server *server, struct gc_arena *gc) } struct dns_options -clone_dns_options(const struct dns_options o, struct gc_arena *gc) +clone_dns_options(const struct dns_options *o, struct gc_arena *gc) { struct dns_options clone; + memset(&clone, 0, sizeof(clone)); - clone.search_domains = clone_dns_domains(o.search_domains, gc); - clone.servers = clone_dns_servers(o.servers, gc); - clone.servers_prepull = clone_dns_servers(o.servers_prepull, gc); + clone.search_domains = clone_dns_domains(o->search_domains, gc); + clone.servers = clone_dns_servers(o->servers, gc); + clone.servers_prepull = clone_dns_servers(o->servers_prepull, gc); + return clone; } diff --git a/src/openvpn/dns.h b/src/openvpn/dns.h index a4ccb9504b3..838ebe15cc7 100644 --- a/src/openvpn/dns.h +++ b/src/openvpn/dns.h @@ -129,7 +129,8 @@ bool dns_options_verify(int msglevel, const struct dns_options *o); * @param gc Pointer to the gc_arena to use for the clone * @return The dns_options clone */ -struct dns_options clone_dns_options(const struct dns_options o, struct gc_arena *gc); +struct dns_options clone_dns_options(const struct dns_options *o, + struct gc_arena *gc); /** * Saves and resets the server options, so that pulled ones don't mix in. diff --git a/src/openvpn/options.c b/src/openvpn/options.c index d8dd51806a6..b2a3a8beebf 100644 --- a/src/openvpn/options.c +++ b/src/openvpn/options.c @@ -3311,7 +3311,7 @@ pre_connect_save(struct options *o) o->pre_connect->route_default_gateway = o->route_default_gateway; o->pre_connect->route_ipv6_default_gateway = o->route_ipv6_default_gateway; - o->pre_connect->dns_options = clone_dns_options(o->dns_options, &o->gc); + o->pre_connect->dns_options = clone_dns_options(&o->dns_options, &o->gc); /* NCP related options that can be overwritten by a push */ o->pre_connect->ciphername = o->ciphername; @@ -3364,7 +3364,7 @@ pre_connect_restore(struct options *o, struct gc_arena *gc) /* Free DNS options and reset them to pre-pull state */ gc_free(&o->dns_options.gc); struct gc_arena dns_gc = gc_new(); - o->dns_options = clone_dns_options(pp->dns_options, &dns_gc); + o->dns_options = clone_dns_options(&pp->dns_options, &dns_gc); o->dns_options.gc = dns_gc; if (pp->client_nat_defined)