From: David Sommerseth <d...@users.sourceforge.net>

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 <d...@users.sourceforge.net>
---
 push.c |   17 +++++++++++++++++
 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;
     }

-- 
1.6.6.1


Reply via email to