From: Lev Stipakov Date: Fri, 24 Mar 2023 12:18:18 +0000 (+0200) Subject: Don't overwrite socket flags when using DCO on Windows X-Git-Tag: v2.7_alpha1~495 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=82e7d5cfd81f03f045ace2bf1d3590b79441ea17;p=thirdparty%2Fopenvpn.git Don't overwrite socket flags when using DCO on Windows 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 Acked-by: Gert Doering 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 --- diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index 216f2ad76..ab8cc754d 100644 --- a/src/openvpn/socket.c +++ b/src/openvpn/socket.c @@ -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 {