From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:54655) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UTDIX-0005Hl-Kq for qemu-devel@nongnu.org; Fri, 19 Apr 2013 11:32:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UTDIR-0002XT-Mr for qemu-devel@nongnu.org; Fri, 19 Apr 2013 11:32:25 -0400 Received: from mail-ee0-f41.google.com ([74.125.83.41]:42882) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UTDIR-0002XG-Hf for qemu-devel@nongnu.org; Fri, 19 Apr 2013 11:32:19 -0400 Received: by mail-ee0-f41.google.com with SMTP id c1so1904416eek.28 for ; Fri, 19 Apr 2013 08:32:18 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Fri, 19 Apr 2013 17:32:08 +0200 Message-Id: <1366385529-10329-4-git-send-email-pbonzini@redhat.com> In-Reply-To: <1366385529-10329-1-git-send-email-pbonzini@redhat.com> References: <1366385529-10329-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH v2 3/4] qemu-char: correct return value from chr_read functions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: amit.shah@redhat.com, aliguori@us.ibm.com, kraxel@redhat.com Even if a CharDriverState's source is blocked by the front-end, it must not be dropped. The IOWatchPoll that wraps it will take care of adding and removing it to the main loop. Only remove the source when the channel is closed; and in that case, make sure that the wrapping IOWatchPoll is removed too. These should just be theoretical bugs. Signed-off-by: Paolo Bonzini --- qemu-char.c | 22 ++++++++++++++++------ 1 files changed, 16 insertions(+), 6 deletions(-) diff --git a/qemu-char.c b/qemu-char.c index d14888d..6e897da 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -781,12 +781,16 @@ static gboolean fd_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque) len = s->max_size; } if (len == 0) { - return FALSE; + return TRUE; } status = g_io_channel_read_chars(chan, (gchar *)buf, len, &bytes_read, NULL); if (status == G_IO_STATUS_EOF) { + if (s->fd_in_tag) { + g_source_remove(s->fd_in_tag); + s->fd_in_tag = 0; + } qemu_chr_be_event(chr, CHR_EVENT_CLOSED); return FALSE; } @@ -1105,8 +1109,9 @@ static gboolean pty_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque) len = sizeof(buf); if (len > s->read_bytes) len = s->read_bytes; - if (len == 0) - return FALSE; + if (len == 0) { + return TRUE; + } status = g_io_channel_read_chars(s->fd, (gchar *)buf, len, &size, NULL); if (status != G_IO_STATUS_NORMAL) { pty_chr_state(chr, 0); @@ -2238,13 +2243,18 @@ static gboolean udp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque) gsize bytes_read = 0; GIOStatus status; - if (s->max_size == 0) - return FALSE; + if (s->max_size == 0) { + return TRUE; + } status = g_io_channel_read_chars(s->chan, (gchar *)s->buf, sizeof(s->buf), &bytes_read, NULL); s->bufcnt = bytes_read; s->bufptr = s->bufcnt; if (status != G_IO_STATUS_NORMAL) { + if (s->tag) { + g_source_remove(s->tag); + s->tag = 0; + } return FALSE; } @@ -2497,7 +2507,7 @@ static gboolean tcp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque) int len, size; if (!s->connected || s->max_size <= 0) { - return FALSE; + return TRUE; } len = sizeof(buf); if (len > s->max_size) -- 1.7.1