diff options
author | Lev Stipakov | 2023-03-24 14:18:18 +0200 |
---|---|---|
committer | Gert Doering | 2023-03-24 13:36:42 +0100 |
commit | cfc5228f9aeaa99c75fb7538435780e4dd7fb7de (patch) | |
tree | bf9a33c3b579af3adbaef900a9694b35c800cd3c | |
parent | 5a189d5e249c89c55ef7cad4d19a9d8e89a20ff1 (diff) | |
download | openvpn-cfc5228f9aeaa99c75fb7538435780e4dd7fb7de.zip openvpn-cfc5228f9aeaa99c75fb7538435780e4dd7fb7de.tar.gz |
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 <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>
(cherry picked from commit 82e7d5cfd81f03f045ace2bf1d3590b79441ea17)
-rw-r--r-- | src/openvpn/socket.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index 216f2ad..ab8cc75 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 { |