]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Add check that username is identical to multi float master
authorArne Schwabe <arne@rfc2549.org>
Fri, 31 Jul 2026 10:08:09 +0000 (12:08 +0200)
committerGert Doering <gert@greenie.muc.de>
Sun, 9 Aug 2026 15:18:44 +0000 (17:18 +0200)
This adds an additional safe guard for setups that do not use
client certificates.

Change-Id: Ie552084638320b3bace76be2f589013f12af3c46
Signed-off-by: Arne Schwabe <arne@rfc2549.org>
Acked-by: Frank Lichtenheld <frank@lichtenheld.com>
Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1724
Message-Id: <20260731100815.3406-1-gert@greenie.muc.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg38095.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
src/openvpn/multi.c

index f5a18f73e651d507560996493e9e3457a0be6f16..20b4f1499d964cc0ce0888d8209fb929421e32c8 100644 (file)
@@ -3111,6 +3111,18 @@ multi_check_dest_addr_allowed(struct multi_context *m, struct multi_instance *mi
         goto done;
     }
 
+    /* do not allow if target address has a different username */
+    if (m1->locked_username || m2->locked_username)
+    {
+        if (!m1->locked_username || !m2->locked_username
+            || strcmp(m1->locked_username, m2->locked_username) != 0)
+        {
+            msg(D_MULTI_LOW, "Disallow float to an address taken by another client %s",
+                multi_instance_string(ex_mi, false, &gc));
+            goto done;
+        }
+    }
+
     /* It doesn't make sense to let a peer float to the address it already
      * has, so we disallow it. This can happen if a DCO netlink notification
      * gets lost and we miss a floating step.
@@ -3127,7 +3139,7 @@ multi_check_dest_addr_allowed(struct multi_context *m, struct multi_instance *mi
 
     msg(D_MULTI_LOW,
         "closing instance %s due to float collision with %s "
-        "using the same certificate",
+        "using the same certificate and username",
         multi_instance_string(ex_mi, false, &gc), multi_instance_string(mi, false, &gc));
     multi_close_instance(m, ex_mi, false);
     ret = true;