]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Don't overwrite socket flags when using DCO on Windows
authorLev Stipakov <lev@openvpn.net>
Fri, 24 Mar 2023 12:18:18 +0000 (14:18 +0200)
committerGert Doering <gert@greenie.muc.de>
Fri, 24 Mar 2023 12:33:40 +0000 (13:33 +0100)
Socket flags can be pushed, in which case they overwrite
existing value. We use socket flags to distingust between
DCO handle and socket on Windows. If server pushes --socket-flags,
we treat DCO handle as socket and everything explodes.

Fix by making link_socket_update_flags() update flags
(like name suggests) instead of overwriting them. Also
do not set TCP_NODELAY on DCO handle on Windows because
it doesn't make sense.

Change-Id: Ia34d73ca49041cb0ce22b84751cdbff57de96048
Signed-off-by: Lev Stipakov <lev@openvpn.net>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <20230324121818.2358-1-lstipakov@gmail.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg26513.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
src/openvpn/socket.c

index 216f2ad7696fa4a6ec8f4489cdca63acf3f568da..ab8cc754d23c46d05668ac9e4f866addd1fc3d8c 100644 (file)
@@ -957,7 +957,8 @@ socket_set_mark(socket_descriptor_t sd, int mark)
 static bool
 socket_set_flags(socket_descriptor_t sd, unsigned int sockflags)
 {
-    if (sockflags & SF_TCP_NODELAY)
+    /* SF_TCP_NODELAY doesn't make sense for dco-win */
+    if ((sockflags & SF_TCP_NODELAY) && (!(sockflags & SF_DCO_WIN)))
     {
         return socket_set_tcp_nodelay(sd, 1);
     }
@@ -972,7 +973,8 @@ link_socket_update_flags(struct link_socket *ls, unsigned int sockflags)
 {
     if (ls && socket_defined(ls->sd))
     {
-        return socket_set_flags(ls->sd, ls->sockflags = sockflags);
+        ls->sockflags |= sockflags;
+        return socket_set_flags(ls->sd, ls->sockflags);
     }
     else
     {