From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36513) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZFVfO-00084d-M3 for qemu-devel@nongnu.org; Wed, 15 Jul 2015 19:00:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZFVfL-0001VH-GX for qemu-devel@nongnu.org; Wed, 15 Jul 2015 19:00:42 -0400 Received: from mail.ludd.ltu.se ([130.240.16.30]:44641) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZFVfL-0001Uj-9j for qemu-devel@nongnu.org; Wed, 15 Jul 2015 19:00:39 -0400 From: pyssling@ludd.ltu.se Date: Wed, 15 Jul 2015 23:00:23 +0000 Message-Id: <1437001223-11039-1-git-send-email-pyssling@ludd.ltu.se> Subject: [Qemu-devel] [PATCH v2] qemu-char: Fix missed data on unix socket List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: pbonzini@redhat.com, qemu-devel@nongnu.org Cc: Nils Carlson From: Nils Carlson Commit 812c1057 introduced HUP detection on unix and tcp sockets prior to a read in tcp_chr_read. This unfortunately broke CloudStack 4.2 which relied on the old behaviour where data on a socket was readable even if a HUP was present. On Linux a working solution seems to be to simply check the HUP after reading all available data, i.e. recv returns a negative value, while keeping the previous behaviour for Windows as it is known to work. Signed-off-by: Nils Carlson --- qemu-char.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qemu-char.c b/qemu-char.c index 617e034..1e9895e 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2847,11 +2847,13 @@ static gboolean tcp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque) uint8_t buf[READ_BUF_LEN]; int len, size; +#ifdef _WIN32 if (cond & G_IO_HUP) { /* connection closed */ tcp_chr_disconnect(chr); return TRUE; } +#endif if (!s->connected || s->max_size <= 0) { return TRUE; @@ -2860,7 +2862,7 @@ static gboolean tcp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque) if (len > s->max_size) len = s->max_size; size = tcp_chr_recv(chr, (void *)buf, len); - if (size == 0) { + if (size == 0 || (size < 0 && (cond & G_IO_HUP))) { /* connection closed */ tcp_chr_disconnect(chr); } else if (size > 0) { -- 1.7.10.4