From patchwork Tue Apr 16 11:10:42 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 236940 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 4A64B2C011C for ; Tue, 16 Apr 2013 21:11:30 +1000 (EST) Received: from localhost ([::1]:37748 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1US3nM-0002BH-CF for incoming@patchwork.ozlabs.org; Tue, 16 Apr 2013 07:11:28 -0400 Received: from eggs.gnu.org ([208.118.235.92]:44854) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1US3mu-00025m-Fi for qemu-devel@nongnu.org; Tue, 16 Apr 2013 07:11:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1US3mt-0007jt-37 for qemu-devel@nongnu.org; Tue, 16 Apr 2013 07:11:00 -0400 Received: from mail-bk0-x233.google.com ([2a00:1450:4008:c01::233]:64068) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1US3ms-0007jo-Sd for qemu-devel@nongnu.org; Tue, 16 Apr 2013 07:10:59 -0400 Received: by mail-bk0-f51.google.com with SMTP id y8so190390bkt.10 for ; Tue, 16 Apr 2013 04:10:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=JbegYo3GaIuJEbEtDjKLLq/rJYaCi3eNwRKlVdzxYMw=; b=My9Vs7U2Q7/4y4cABjg/ujYaD4g8Xj/2YhE1GcjfqrIDdD5wUdk6n4miI+5Pw60Rxv dKCxqXFdp0kErPz+1608EtIL9GOS5l51/E1j2GuAFEA52n1Ba84/lNT/iCz33XtzfECL zNvOPC1Ob3M4tDhbdtwiKnqGCatJiK0kYxqyT7JQ0dO+RkdfJFerfwNKFR+bGQkl+O4C VE05TitigZHVTVM2Tbi53rl1ia/ZlBAyFTThwPX8quWFi3+3NDIyB5CaBbcWWNmnzpXH N7+ctWfxI5aYpu/f6Q6zPsvrVrGq/ssxE9wT8SCHwUrIxF5Ln0CX03Buc2byJXg0aHLL I5iQ== X-Received: by 10.205.18.194 with SMTP id qh2mr411574bkb.36.1366110658053; Tue, 16 Apr 2013 04:10:58 -0700 (PDT) Received: from playground.lan (93-34-176-20.ip50.fastwebnet.it. [93.34.176.20]) by mx.google.com with ESMTPS id gu14sm559651bkc.1.2013.04.16.04.10.55 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 16 Apr 2013 04:10:57 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 16 Apr 2013 13:10:42 +0200 Message-Id: <1366110642-22095-4-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1366110642-22095-1-git-send-email-pbonzini@redhat.com> References: <1366110642-22095-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4008:c01::233 Cc: kraxel@redhat.com Subject: [Qemu-devel] [PATCH 3/3] qemu-char: correct return value from chr_read functions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 file 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)