From: David Sommerseth Date: Sat, 12 Jun 2010 22:35:55 +0000 (+0200) Subject: Fixed client hang when server don't PUSH (aka the NO_SOUP_FOR_YOU patch) X-Git-Tag: v2.2-beta4~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e0221d9d4d4329918d914ddcce188d0dc7c99357;p=thirdparty%2Fopenvpn.git Fixed client hang when server don't PUSH (aka the NO_SOUP_FOR_YOU patch) Solves bug 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 Acked-by: James Yonan --- diff --git a/push.c b/push.c index 9ddc90027..1320bec52 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); @@ -217,6 +219,21 @@ send_push_reply (struct context *c) if (BLEN (&buf) > sizeof(cmd)-1) { 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; }