diff options
author | David Sommerseth <dazo@users.sourceforge.net> | 2010-06-13 00:35:55 +0200 |
---|---|---|
committer | David Sommerseth <dazo@users.sourceforge.net> | 2010-06-17 21:02:03 +0200 |
commit | cb56a3ebe65871ae37894503e35c0b3703ee17a5 (patch) | |
tree | df76d108b2248040ad149ea4ac34290b442e6423 | |
parent | Handle non standard subnets in PF grammar (diff) | |
download | openvpn-cb56a3ebe65871ae37894503e35c0b3703ee17a5.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.c | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -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; } |