From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53842) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZG9RL-00067B-Jy for qemu-devel@nongnu.org; Fri, 17 Jul 2015 13:28:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZG9RI-0001vg-E4 for qemu-devel@nongnu.org; Fri, 17 Jul 2015 13:28:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49260) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZG9RI-0001va-8r for qemu-devel@nongnu.org; Fri, 17 Jul 2015 13:28:48 -0400 References: <1437153114-19074-1-git-send-email-pyssling@ludd.ltu.se> From: Paolo Bonzini Message-ID: <55A93B4B.4060408@redhat.com> Date: Fri, 17 Jul 2015 19:28:43 +0200 MIME-Version: 1.0 In-Reply-To: <1437153114-19074-1-git-send-email-pyssling@ludd.ltu.se> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v3] qemu-char: Fix missed data on unix socket List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: pyssling@ludd.ltu.se, batuzovk@ispras.ru, qemu-devel@nongnu.org On 17/07/2015 19:11, pyssling@ludd.ltu.se wrote: > 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. > > A working solution seems to be to simply check for a HUP after > reading all available data, i.e. recv returns a negative value. > > Signed-off-by: Nils Carlson > --- > qemu-char.c | 8 +------- > 1 file changed, 1 insertion(+), 7 deletions(-) > > diff --git a/qemu-char.c b/qemu-char.c > index 617e034..f92fcee 100644 > --- a/qemu-char.c > +++ b/qemu-char.c > @@ -2847,12 +2847,6 @@ static gboolean tcp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque) > uint8_t buf[READ_BUF_LEN]; > int len, size; > > - if (cond & G_IO_HUP) { > - /* connection closed */ > - tcp_chr_disconnect(chr); > - return TRUE; > - } > - > if (!s->connected || s->max_size <= 0) { > return TRUE; > } > @@ -2860,7 +2854,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) { > This looks good, but I'll also wait for your report on testing the patch that uses the recv return value. Paolo