From cb56a3ebe65871ae37894503e35c0b3703ee17a5 Mon Sep 17 00:00:00 2001 From: David Sommerseth Date: Sun, 13 Jun 2010 00:35:55 +0200 Subject: 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 --- push.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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); @@ -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; } -- cgit v1.2.3