From patchwork Mon Feb 27 13:35:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= X-Patchwork-Id: 9593163 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id DD8B7601D7 for ; Mon, 27 Feb 2017 13:47:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CB15427CEA for ; Mon, 27 Feb 2017 13:47:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BC4F628305; Mon, 27 Feb 2017 13:47:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 480EB27CEA for ; Mon, 27 Feb 2017 13:47:54 +0000 (UTC) Received: from localhost ([::1]:52923 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ciLeb-0005cZ-7R for patchwork-qemu-devel@patchwork.kernel.org; Mon, 27 Feb 2017 08:47:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51004) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ciLSz-0003zB-Td for qemu-devel@nongnu.org; Mon, 27 Feb 2017 08:35:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ciLSw-0007hB-0A for qemu-devel@nongnu.org; Mon, 27 Feb 2017 08:35:53 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52952) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ciLSv-0007h2-Qd for qemu-devel@nongnu.org; Mon, 27 Feb 2017 08:35:49 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EAB85C05681A; Mon, 27 Feb 2017 13:35:49 +0000 (UTC) Received: from t460.redhat.com (ovpn-117-152.ams2.redhat.com [10.36.117.152]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1RDZimc019878; Mon, 27 Feb 2017 08:35:48 -0500 From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Mon, 27 Feb 2017 13:35:29 +0000 Message-Id: <20170227133531.31874-2-berrange@redhat.com> In-Reply-To: <20170227133531.31874-1-berrange@redhat.com> References: <20170227133531.31874-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 27 Feb 2017 13:35:49 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL v1 1/3] io: fix decoding when multiple websockets frames arrive at once X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP The qio_channel_websock_read_wire() method will read upto 4096 bytes off the socket and then decode the websockets header and payload. The code was only decoding a single websockets frame, even if the buffered data contained multiple frames. This meant that decoding of subsequent frames was delayed until further input arrived on the socket. This backlog of delayed frames gets worse & worse over time. Symptom was that when connecting to the VNC server via the built-in websockets server, mouse/keyboard interaction would start out fine, but slowly get more & more delayed until it was unusable. Signed-off-by: Daniel P. Berrange --- io/channel-websock.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/io/channel-websock.c b/io/channel-websock.c index e47279a..a06a4a8 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -570,21 +570,24 @@ static ssize_t qio_channel_websock_read_wire(QIOChannelWebsock *ioc, ioc->encinput.offset += ret; } - if (ioc->payload_remain == 0) { - ret = qio_channel_websock_decode_header(ioc, errp); + while (ioc->encinput.offset != 0) { + if (ioc->payload_remain == 0) { + ret = qio_channel_websock_decode_header(ioc, errp); + if (ret < 0) { + return ret; + } + if (ret == 0) { + ioc->io_eof = TRUE; + break; + } + } + + ret = qio_channel_websock_decode_payload(ioc, errp); if (ret < 0) { return ret; } - if (ret == 0) { - return 0; - } } - - ret = qio_channel_websock_decode_payload(ioc, errp); - if (ret < 0) { - return ret; - } - return ret; + return 1; } @@ -642,9 +645,6 @@ static gboolean qio_channel_websock_flush(QIOChannel *ioc, if (ret < 0) { goto cleanup; } - if (ret == 0) { - wioc->io_eof = TRUE; - } } cleanup: