aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLev Stipakov2023-03-24 14:18:18 +0200
committerGert Doering2023-03-24 13:36:42 +0100
commitcfc5228f9aeaa99c75fb7538435780e4dd7fb7de (patch)
treebf9a33c3b579af3adbaef900a9694b35c800cd3c
parent5a189d5e249c89c55ef7cad4d19a9d8e89a20ff1 (diff)
downloadopenvpn-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.c6
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
{