Description: 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 more to push to the client. Author: David Sommerseth Origin: upstream, https://community.openvpn.net/openvpn/attachment/ticket/13/0001-Fixed-client-hang-when-server-don-t-PUSH-aka-the-NO_.patch Bug: https://community.openvpn.net/openvpn/ticket/13 Reviewed-By: James Yonan Index: openvpn-2.1.3/push.c =================================================================== --- openvpn-2.1.3.orig/push.c 2010-05-31 09:05:55.000000000 +0200 +++ openvpn-2.1.3/push.c 2010-09-29 13:15:46.788461606 +0200 @@ -177,6 +177,7 @@ 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 @@ 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 @@ { 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; }