Attention is currently required from: cron2, flichtenheld, plaisthos.

Hello flichtenheld, plaisthos,

I'd like you to reexamine a change. Please visit

    http://gerrit.openvpn.net/c/openvpn/+/1210?usp=email

to look at the new patch set (#3).


Change subject: redirect-gateway: only redirect traffic through TUN if address 
families match
......................................................................

redirect-gateway: only redirect traffic through TUN if address families match

Fixes an ifconfig push-reply bug where, if the remote is switched and the new
TUN has a different address family, the previous ifconfig options remain
assigned to the new TUN.

Adds a check in do_init_route_ipv6_list() to add default routes toward the TUN
only if the TUN has IPv6 addresses.

It also resets the ifconfig and ifconfig-ipv6 options on every PUSH_REPLY and
whenever a valid ifconfig or ifconfig-ipv6 option is found in a PUSH_UPDATE
message to avoid stale data conflicts. This may be necessary when the new
address has a different address family than the old one.

Change-Id: Ib3458a9ed2eb38e00184c4a92659b83b97fe476c
---
M src/openvpn/init.c
M src/openvpn/options.c
2 files changed, 62 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/10/1210/3

diff --git a/src/openvpn/init.c b/src/openvpn/init.c
index f8a0fee..aaa0573 100644
--- a/src/openvpn/init.c
+++ b/src/openvpn/init.c
@@ -1523,7 +1523,7 @@

     /* redirect (IPv6) gateway to VPN?  if yes, add a few more specifics
      */
-    if (options->routes_ipv6->flags & RG_REROUTE_GW)
+    if (options->routes_ipv6->flags & RG_REROUTE_GW && 
options->ifconfig_ipv6_local)
     {
         char *opt_list[] = { "::/3", "2000::/4", "3000::/4", "fc00::/7", NULL 
};
         int i;
diff --git a/src/openvpn/options.c b/src/openvpn/options.c
index f35738d..fc18931 100644
--- a/src/openvpn/options.c
+++ b/src/openvpn/options.c
@@ -5459,6 +5459,17 @@
     }
 }

+/* Reset all ifconfig and ifconfig-ipv6 related options to their default/NULL 
state */
+#define RESET_IFCONFIG_OPTIONS(opt)            \
+    do                                         \
+    {                                          \
+        (opt)->ifconfig_local = NULL;          \
+        (opt)->ifconfig_remote_netmask = NULL; \
+        (opt)->ifconfig_ipv6_local = NULL;     \
+        (opt)->ifconfig_ipv6_netbits = 0;      \
+        (opt)->ifconfig_ipv6_remote = NULL;    \
+    } while (0)
+
 bool
 apply_push_options(struct context *c, struct options *options, struct buffer 
*buf,
                    unsigned int permission_mask, unsigned int 
*option_types_found,
@@ -5470,6 +5481,14 @@
     const msglvl_t msglevel = D_PUSH_ERRORS | M_OPTERR;
     unsigned int update_options_found = 0;

+    /* When receiving a PUSH_REPLY, reset the ifconfig options to prevent
+     * stale data conflicts. This could be necessary when the new address has a
+     * different address family than the previous one. */
+    if (!is_update)
+    {
+        RESET_IFCONFIG_OPTIONS(options);
+    }
+
     while (buf_parse(buf, ',', line, sizeof(line)))
     {
         char *p[MAX_PARMS + 1];
@@ -6014,7 +6033,48 @@
     const bool pull_mode = BOOL_CAST(permission_mask & OPT_P_PULL_MODE);
     ASSERT(MAX_PARMS >= 7);

-    if (streq(p[0], "route") && p[1] && !p[5])
+    if (streq(p[0], "ifconfig") && p[1] && p[2] && !p[3])
+    {
+        VERIFY_PERMISSION(OPT_P_UP);
+        if (ip_or_dns_addr_safe(p[1], options->allow_pull_fqdn)
+            && ip_or_dns_addr_safe(p[2], options->allow_pull_fqdn)) /* FQDN -- 
may be DNS name */
+        {
+            /* When receiving a PUSH_UPDATE containing a valid ifconfig option,
+             * we should reset the ifconfig and ifconfig-ipv6 options to 
prevent
+             * stale data conflicts. This could be necessary when the new 
address has a
+             * different address family than the previous one. Same is true 
when a valid
+             * ifconfig-ipv6 option is received. */
+            RESET_IFCONFIG_OPTIONS(options);
+        }
+        else
+        {
+            msg(msglevel, "ifconfig parms '%s' and '%s' must be valid 
addresses", p[1], p[2]);
+            goto err;
+        }
+    }
+    else if (streq(p[0], "ifconfig-ipv6") && p[1] && p[2] && !p[3])
+    {
+        unsigned int netbits;
+
+        VERIFY_PERMISSION(OPT_P_UP);
+        if (get_ipv6_addr(p[1], NULL, &netbits, msglevel) && 
ipv6_addr_safe(p[2]))
+        {
+            if (netbits < 64 || netbits > 124)
+            {
+                msg(msglevel, "ifconfig-ipv6: /netbits must be between 64 and 
124, not '/%d'",
+                    netbits);
+                goto err;
+            }
+
+            RESET_IFCONFIG_OPTIONS(options);
+        }
+        else
+        {
+            msg(msglevel, "ifconfig-ipv6 parms '%s' and '%s' must be valid 
addresses", p[1], p[2]);
+            goto err;
+        }
+    }
+    else if (streq(p[0], "route") && p[1] && !p[5])
     {
         if (!(*update_options_found & OPT_P_U_ROUTE))
         {

--
To view, visit http://gerrit.openvpn.net/c/openvpn/+/1210?usp=email
To unsubscribe, or for help writing mail filters, visit 
http://gerrit.openvpn.net/settings?usp=email

Gerrit-MessageType: newpatchset
Gerrit-Project: openvpn
Gerrit-Branch: master
Gerrit-Change-Id: Ib3458a9ed2eb38e00184c4a92659b83b97fe476c
Gerrit-Change-Number: 1210
Gerrit-PatchSet: 3
Gerrit-Owner: mrbff <[email protected]>
Gerrit-Reviewer: flichtenheld <[email protected]>
Gerrit-Reviewer: plaisthos <[email protected]>
Gerrit-CC: cron2 <[email protected]>
Gerrit-CC: openvpn-devel <[email protected]>
Gerrit-Attention: plaisthos <[email protected]>
Gerrit-Attention: cron2 <[email protected]>
Gerrit-Attention: flichtenheld <[email protected]>
_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to