summaryrefslogtreecommitdiff
path: root/debian/patches/client_hang_when_server_dont_push.patch
blob: 3e56613559456c2de5ba979dc320eed4eec6ca15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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 <dazo@users.sourceforge.net>
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 <james@openvpn.net>

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;
     }