aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLev Stipakov2023-12-20 14:36:37 +0100
committerGert Doering2023-12-21 14:16:17 +0100
commit030afe64198e6c32297dcdbf33ff9c5f6a35f5e1 (patch)
treec8286de31405a0f47889489ca04e2a9d9ce138e3
parente2a9c1ba947fbe18af124583cc30eb1b2bd2aab0 (diff)
downloadopenvpn-030afe64198e6c32297dcdbf33ff9c5f6a35f5e1.zip
openvpn-030afe64198e6c32297dcdbf33ff9c5f6a35f5e1.tar.gz
tun.c: don't attempt to delete DNS and WINS servers if they're not set
Commits 1c4a47f7 ("wintun: set adapter properties via interactive service") 18826de5 ("Set WINS servers via interactice service") added functionality of add/remove DNS/WINS via interactive service, which is used mostly by dco-win and wintun (tap-windows6 normally uses DHCP). There is a check in code - if DNS/WINS addresses are not pushed, nothing is added. However, due to bug we always attempted to remove DNS/WINS, even if nothing was added. Removing WINS, for example, could take up to 3 seconds. This change fixes this by improving check "has DNS/WINS been pushed?". While on it, convert do_XXX_service() functions to "void" from "bool", since we never check their return values. Change-Id: I21a36d24f8e213c780f55acbe3e4df555c93542a Signed-off-by: Lev Stipakov <lev@openvpn.net> Acked-by: Frank Lichtenheld <frank@lichtenheld.com> Message-Id: <20231220133637.60996-1-frank@lichtenheld.com> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg27843.html Signed-off-by: Gert Doering <gert@greenie.muc.de> (cherry picked from commit c590868a721881dd21bfb77ecf846e6c8720e4ef)
-rw-r--r--src/openvpn/tun.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c
index 82ab6c0..dd96553 100644
--- a/src/openvpn/tun.c
+++ b/src/openvpn/tun.c
@@ -147,17 +147,16 @@ out:
return ret;
}
-static bool
+static void
do_dns_domain_service(bool add, const struct tuntap *tt)
{
- bool ret = false;
ack_message_t ack;
struct gc_arena gc = gc_new();
HANDLE pipe = tt->options.msg_channel;
if (!tt->options.domain) /* no domain to add or delete */
{
- return true;
+ goto out;
}
/* Use dns_cfg_msg with addr_len = 0 for setting only the DOMAIN */
@@ -195,17 +194,14 @@ do_dns_domain_service(bool add, const struct tuntap *tt)
}
msg(M_INFO, "DNS domain %s using service", (add ? "set" : "deleted"));
- ret = true;
out:
gc_free(&gc);
- return ret;
}
-static bool
+static void
do_dns_service(bool add, const short family, const struct tuntap *tt)
{
- bool ret = false;
ack_message_t ack;
struct gc_arena gc = gc_new();
HANDLE pipe = tt->options.msg_channel;
@@ -213,9 +209,10 @@ do_dns_service(bool add, const short family, const struct tuntap *tt)
int addr_len = add ? len : 0;
const char *ip_proto_name = family == AF_INET6 ? "IPv6" : "IPv4";
- if (addr_len == 0 && add) /* no addresses to add */
+ if (len == 0)
{
- return true;
+ /* nothing to do */
+ goto out;
}
/* Use dns_cfg_msg with domain = "" for setting only the DNS servers */
@@ -272,26 +269,23 @@ do_dns_service(bool add, const short family, const struct tuntap *tt)
}
msg(M_INFO, "%s dns servers %s using service", ip_proto_name, (add ? "set" : "deleted"));
- ret = true;
out:
gc_free(&gc);
- return ret;
}
-static bool
+static void
do_wins_service(bool add, const struct tuntap *tt)
{
- bool ret = false;
ack_message_t ack;
struct gc_arena gc = gc_new();
HANDLE pipe = tt->options.msg_channel;
- int len = tt->options.wins_len;
- int addr_len = add ? len : 0;
+ int addr_len = add ? tt->options.wins_len : 0;
- if (addr_len == 0 && add) /* no addresses to add */
+ if (tt->options.wins_len == 0)
{
- return true;
+ /* nothing to do */
+ goto out;
}
wins_cfg_message_t wins = {
@@ -338,11 +332,9 @@ do_wins_service(bool add, const struct tuntap *tt)
}
msg(M_INFO, "WINS servers %s using service", (add ? "set" : "deleted"));
- ret = true;
out:
gc_free(&gc);
- return ret;
}
static bool
@@ -7022,10 +7014,7 @@ close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx)
{
do_dns_domain_service(false, tt);
}
- if (tt->options.dns6_len > 0)
- {
- do_dns_service(false, AF_INET6, tt);
- }
+ do_dns_service(false, AF_INET6, tt);
delete_route_connected_v6_net(tt);
do_address_service(false, AF_INET6, tt);
}