aboutsummaryrefslogtreecommitdiff
path: root/push.c
diff options
context:
space:
mode:
authorDavid Sommerseth <dazo@users.sourceforge.net>2010-06-13 00:35:55 +0200
committerDavid Sommerseth <dazo@users.sourceforge.net>2010-10-21 11:40:36 +0200
commite0221d9d4d4329918d914ddcce188d0dc7c99357 (patch)
tree3fb5d79caf0a6eb86880d87d45c0ae8e52814f6f /push.c
parentHandle non standard subnets in PF grammar (diff)
downloadopenvpn-e0221d9d4d4329918d914ddcce188d0dc7c99357.tar.xz
Fixed client hang when server don't PUSH (aka the NO_SOUP_FOR_YOU patch)
Solves bug ticket 13 <https://community.openvpn.net/openvpn/ticket/13> When the client sends PUSH_REQUESTS, it waits until the server sends PUSH_REPLY. If the server do not have anything to push to the client nothing happens. The client will then regularly send new PUSH_REQUESTS until it gets an answer, which results in not completing the connection negotiation. This patch makes the server send an empty PUSH_REPLY when it has nothing to more to push to the client. Signed-off-by: David Sommerseth <dazo@users.sourceforge.net> Acked-by: James Yonan <james@openvpn.net>
Diffstat (limited to '')
-rw-r--r--push.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/push.c b/push.c
index 9ddc900..1320bec 100644
--- a/push.c
+++ b/push.c
@@ -177,6 +177,7 @@ send_push_reply (struct context *c)
static char cmd[] = "PUSH_REPLY";
const int extra = 64; /* extra space for possible trailing ifconfig and push-continuation */
const int safe_cap = BCAP (&buf) - extra;
+ bool push_sent = false;
buf_printf (&buf, cmd);
@@ -192,6 +193,7 @@ send_push_reply (struct context *c)
const bool status = send_control_channel_string (c, BSTR (&buf), D_PUSH);
if (!status)
goto fail;
+ push_sent = true;
multi_push = true;
buf_reset_len (&buf);
buf_printf (&buf, cmd);
@@ -218,6 +220,21 @@ send_push_reply (struct context *c)
{
const bool status = send_control_channel_string (c, BSTR (&buf), D_PUSH);
if (!status)
+ goto fail;
+ push_sent = true;
+ }
+
+ /* If nothing have been pushed, send an empty push,
+ * as the client is expecting a response
+ */
+ if (!push_sent)
+ {
+ bool status = false;
+
+ buf_reset_len (&buf);
+ buf_printf (&buf, cmd);
+ status = send_control_channel_string (c, BSTR(&buf), D_PUSH);
+ if (!status)
goto fail;
}