From nobody Sat May 4 07:55:09 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507650351940692.2472052112721; Tue, 10 Oct 2017 08:45:51 -0700 (PDT) Received: from localhost ([::1]:35689 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1wio-0003nx-SN for importer@patchew.org; Tue, 10 Oct 2017 11:45:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47580) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1wh7-0002d1-RN for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1wh2-0002yH-9x for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37050) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1wh2-0002xw-3w for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:40 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 20AD0C04B928 for ; Tue, 10 Oct 2017 15:43:39 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.82]) by smtp.corp.redhat.com (Postfix) with ESMTP id 371FE68889; Tue, 10 Oct 2017 15:43:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 20AD0C04B928 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=berrange@redhat.com From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 16:43:22 +0100 Message-Id: <20171010154328.8419-2-berrange@redhat.com> In-Reply-To: <20171010154328.8419-1-berrange@redhat.com> References: <20171010154328.8419-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 10 Oct 2017 15:43:39 +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] [PATCH v1 1/7] io: monitor encoutput buffer size from websocket GSource 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The websocket GSource is monitoring the size of the rawoutput buffer to determine if the channel can accepts more writes. The rawoutput buffer, however, is merely a temporary staging buffer before data is copied into the encoutput buffer. This its size will always be zero when the GSource runs. This flaw causes the encoutput buffer to grow without bound if the other end of the underlying data channel doesn't read data being sent. This can be seen with VNC if a client is on a slow WAN link and the guest OS is sending many screen updates. A malicious VNC client can act like it is on a slow link by playing a video in the guest and then reading data very slowly, causing QEMU host memory to expand arbitrarily. This issue is assigned CVE-2017-????, publically reported in https://bugs.launchpad.net/qemu/+bug/1718964 Signed-off-by: Daniel P. Berrange Reviewed-by: Eric Blake --- io/channel-websock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io/channel-websock.c b/io/channel-websock.c index d1d471f86e..04bcc059cd 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -28,7 +28,7 @@ #include =20 =20 -/* Max amount to allow in rawinput/rawoutput buffers */ +/* Max amount to allow in rawinput/encoutput buffers */ #define QIO_CHANNEL_WEBSOCK_MAX_BUFFER 8192 =20 #define QIO_CHANNEL_WEBSOCK_CLIENT_KEY_LEN 24 @@ -1208,7 +1208,7 @@ qio_channel_websock_source_check(GSource *source) if (wsource->wioc->rawinput.offset || wsource->wioc->io_eof) { cond |=3D G_IO_IN; } - if (wsource->wioc->rawoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) { + if (wsource->wioc->encoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) { cond |=3D G_IO_OUT; } =20 --=20 2.13.5 From nobody Sat May 4 07:55:09 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507650468016742.7423690955123; Tue, 10 Oct 2017 08:47:48 -0700 (PDT) Received: from localhost ([::1]:35702 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1wkx-0005iR-90 for importer@patchew.org; Tue, 10 Oct 2017 11:47:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47564) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1wh6-0002bz-Fu for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1wh5-00030g-Hs for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39188) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1wh5-0002zu-8z for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:43 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 47D725F2965 for ; Tue, 10 Oct 2017 15:43:42 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.82]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7C59B68889; Tue, 10 Oct 2017 15:43:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 47D725F2965 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=berrange@redhat.com From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 16:43:23 +0100 Message-Id: <20171010154328.8419-3-berrange@redhat.com> In-Reply-To: <20171010154328.8419-1-berrange@redhat.com> References: <20171010154328.8419-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 10 Oct 2017 15:43:42 +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] [PATCH v1 2/7] io: simplify websocket ping reply handling 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We must ensure we don't get flooded with ping replies if the outbound channel is slow. Currently we do this by keeping the ping reply in a separate temporary buffer and only writing it if the encoutput buffer is completely empty. This is overly pessimistic, as it is reasonable to add a ping reply to the encoutput buffer even if it has previous data in it, as long as that previous data doesn't include a ping reply. To track this better, put the ping reply directly into the encoutput buffer, and then record the size of encoutput at this time in ping_remain. As we write encoutput to the underlying channel, we can decrement the ping_remain counter. Once it hits zero, we can accept further ping replies for transmission. Signed-off-by: Daniel P. Berrange Reviewed-by: Eric Blake --- include/io/channel-websock.h | 2 +- io/channel-websock.c | 28 +++++++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/include/io/channel-websock.h b/include/io/channel-websock.h index ff32d8651b..3f92535cae 100644 --- a/include/io/channel-websock.h +++ b/include/io/channel-websock.h @@ -60,8 +60,8 @@ struct QIOChannelWebsock { Buffer encoutput; Buffer rawinput; Buffer rawoutput; - Buffer ping_reply; size_t payload_remain; + size_t ping_remain; QIOChannelWebsockMask mask; guint io_tag; Error *io_err; diff --git a/io/channel-websock.c b/io/channel-websock.c index 04bcc059cd..1c34f68012 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -825,11 +825,14 @@ static int qio_channel_websock_decode_payload(QIOChan= nelWebsock *ioc, } return -1; } else if (ioc->opcode =3D=3D QIO_CHANNEL_WEBSOCK_OPCODE_PING) { - /* ping frames produce an immediate reply */ - buffer_reset(&ioc->ping_reply); - qio_channel_websock_encode_buffer( - ioc, &ioc->ping_reply, QIO_CHANNEL_WEBSOCK_OPCODE_PONG, - &ioc->encinput); + /* ping frames produce an immediate reply, as long as we've not st= ill + * got a previous ping queued, in which case we drop the new pong = */ + if (ioc->ping_remain =3D=3D 0) { + qio_channel_websock_encode_buffer( + ioc, &ioc->encoutput, QIO_CHANNEL_WEBSOCK_OPCODE_PONG, + &ioc->encinput); + ioc->ping_remain =3D ioc->encoutput.offset; + } } /* pong frames are ignored */ =20 if (payload_len) { @@ -888,7 +891,6 @@ static void qio_channel_websock_finalize(Object *obj) buffer_free(&ioc->encoutput); buffer_free(&ioc->rawinput); buffer_free(&ioc->rawoutput); - buffer_free(&ioc->ping_reply); object_unref(OBJECT(ioc->master)); if (ioc->io_tag) { g_source_remove(ioc->io_tag); @@ -946,12 +948,7 @@ static ssize_t qio_channel_websock_write_wire(QIOChann= elWebsock *ioc, ssize_t ret; ssize_t done =3D 0; =20 - /* ping replies take priority over binary data */ - if (!ioc->ping_reply.offset) { - qio_channel_websock_encode(ioc); - } else if (!ioc->encoutput.offset) { - buffer_move_empty(&ioc->encoutput, &ioc->ping_reply); - } + qio_channel_websock_encode(ioc); =20 while (ioc->encoutput.offset > 0) { ret =3D qio_channel_write(ioc->master, @@ -968,6 +965,11 @@ static ssize_t qio_channel_websock_write_wire(QIOChann= elWebsock *ioc, } buffer_advance(&ioc->encoutput, ret); done +=3D ret; + if (ioc->ping_remain < ret) { + ioc->ping_remain =3D 0; + } else { + ioc->ping_remain -=3D ret; + } } return done; } @@ -1026,7 +1028,7 @@ static void qio_channel_websock_set_watch(QIOChannelW= ebsock *ioc) return; } =20 - if (ioc->encoutput.offset || ioc->ping_reply.offset) { + if (ioc->encoutput.offset) { cond |=3D G_IO_OUT; } if (ioc->encinput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER && --=20 2.13.5 From nobody Sat May 4 07:55:09 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507650612499599.3623627966641; Tue, 10 Oct 2017 08:50:12 -0700 (PDT) Received: from localhost ([::1]:35710 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1wnB-0007Q7-Je for importer@patchew.org; Tue, 10 Oct 2017 11:50:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47578) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1wh7-0002cm-Kb for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1wh6-00033G-Qm for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43162) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1wh6-00030q-KP for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:44 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A23C081236 for ; Tue, 10 Oct 2017 15:43:43 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.82]) by smtp.corp.redhat.com (Postfix) with ESMTP id D46ED5C1A3; Tue, 10 Oct 2017 15:43:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A23C081236 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=berrange@redhat.com From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 16:43:24 +0100 Message-Id: <20171010154328.8419-4-berrange@redhat.com> In-Reply-To: <20171010154328.8419-1-berrange@redhat.com> References: <20171010154328.8419-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 10 Oct 2017 15:43:43 +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] [PATCH v1 3/7] io: get rid of qio_channel_websock_encode helper method 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The qio_channel_websock_encode method is only used in one place, everything else calls qio_channel_websock_encode_buffer directly. It can also be pushed up a level into the qio_channel_websock_writev method, since every other caller of qio_channel_websock_write_wire has already filled encoutput. Signed-off-by: Daniel P. Berrange Reviewed-by: Eric Blake --- io/channel-websock.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/io/channel-websock.c b/io/channel-websock.c index 1c34f68012..17f50f5bb1 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -616,18 +616,6 @@ static void qio_channel_websock_encode_buffer(QIOChann= elWebsock *ioc, } =20 =20 -static void qio_channel_websock_encode(QIOChannelWebsock *ioc) -{ - if (!ioc->rawoutput.offset) { - return; - } - qio_channel_websock_encode_buffer( - ioc, &ioc->encoutput, QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME, - &ioc->rawoutput); - buffer_reset(&ioc->rawoutput); -} - - static ssize_t qio_channel_websock_write_wire(QIOChannelWebsock *, Error *= *); =20 =20 @@ -948,8 +936,6 @@ static ssize_t qio_channel_websock_write_wire(QIOChanne= lWebsock *ioc, ssize_t ret; ssize_t done =3D 0; =20 - qio_channel_websock_encode(ioc); - while (ioc->encoutput.offset > 0) { ret =3D qio_channel_write(ioc->master, (char *)ioc->encoutput.buffer, @@ -1134,6 +1120,12 @@ static ssize_t qio_channel_websock_writev(QIOChannel= *ioc, } =20 done: + if (ioc->rawoutput.offset) { + qio_channel_websock_encode_buffer( + ioc, &ioc->encoutput, QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME, + &ioc->rawoutput); + buffer_reset(&ioc->rawoutput); + } ret =3D qio_channel_websock_write_wire(wioc, errp); if (ret < 0 && ret !=3D QIO_CHANNEL_ERR_BLOCK) { --=20 2.13.5 From nobody Sat May 4 07:55:09 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507650343598683.313458897224; Tue, 10 Oct 2017 08:45:43 -0700 (PDT) Received: from localhost ([::1]:35691 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1wis-0003rb-1c for importer@patchew.org; Tue, 10 Oct 2017 11:45:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47617) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1whB-0002eu-1D for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1wh7-00034x-VW for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:49 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43252) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1wh7-00033m-Mx for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:45 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B4AAC81245 for ; Tue, 10 Oct 2017 15:43:44 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.82]) by smtp.corp.redhat.com (Postfix) with ESMTP id 014F0679E8; Tue, 10 Oct 2017 15:43:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B4AAC81245 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=berrange@redhat.com From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 16:43:25 +0100 Message-Id: <20171010154328.8419-5-berrange@redhat.com> In-Reply-To: <20171010154328.8419-1-berrange@redhat.com> References: <20171010154328.8419-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 10 Oct 2017 15:43:44 +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] [PATCH v1 4/7] io: pass a struct iovec into qio_channel_websock_encode 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Instead of requiring use of another Buffer, pass a struct iovec into qio_channel_websock_encode, which gives callers more flexibility in how they process data. Signed-off-by: Daniel P. Berrange --- io/channel-websock.c | 69 ++++++++++++++++++++++++++++++++----------------= ---- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/io/channel-websock.c b/io/channel-websock.c index 17f50f5bb1..ad62dda479 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -582,11 +582,14 @@ static gboolean qio_channel_websock_handshake_io(QIOC= hannel *ioc, } =20 =20 -static void qio_channel_websock_encode_buffer(QIOChannelWebsock *ioc, - Buffer *output, - uint8_t opcode, Buffer *buff= er) +static void qio_channel_websock_encode(QIOChannelWebsock *ioc, + uint8_t opcode, + const struct iovec *iov, + size_t niov, + size_t size) { size_t header_size; + size_t i; union { char buf[QIO_CHANNEL_WEBSOCK_HEADER_LEN_64_BIT]; QIOChannelWebsockHeader ws; @@ -594,25 +597,31 @@ static void qio_channel_websock_encode_buffer(QIOChan= nelWebsock *ioc, =20 header.ws.b0 =3D QIO_CHANNEL_WEBSOCK_HEADER_FIELD_FIN | (opcode & QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE); - if (buffer->offset < QIO_CHANNEL_WEBSOCK_PAYLOAD_LEN_THRESHOLD_7_BIT) { - header.ws.b1 =3D (uint8_t)buffer->offset; + if (size < QIO_CHANNEL_WEBSOCK_PAYLOAD_LEN_THRESHOLD_7_BIT) { + header.ws.b1 =3D (uint8_t)size; header_size =3D QIO_CHANNEL_WEBSOCK_HEADER_LEN_7_BIT; - } else if (buffer->offset < - QIO_CHANNEL_WEBSOCK_PAYLOAD_LEN_THRESHOLD_16_BIT) { + } else if (size < QIO_CHANNEL_WEBSOCK_PAYLOAD_LEN_THRESHOLD_16_BIT) { header.ws.b1 =3D QIO_CHANNEL_WEBSOCK_PAYLOAD_LEN_MAGIC_16_BIT; - header.ws.u.s16.l16 =3D cpu_to_be16((uint16_t)buffer->offset); + header.ws.u.s16.l16 =3D cpu_to_be16((uint16_t)size); header_size =3D QIO_CHANNEL_WEBSOCK_HEADER_LEN_16_BIT; } else { header.ws.b1 =3D QIO_CHANNEL_WEBSOCK_PAYLOAD_LEN_MAGIC_64_BIT; - header.ws.u.s64.l64 =3D cpu_to_be64(buffer->offset); + header.ws.u.s64.l64 =3D cpu_to_be64(size); header_size =3D QIO_CHANNEL_WEBSOCK_HEADER_LEN_64_BIT; } header_size -=3D QIO_CHANNEL_WEBSOCK_HEADER_LEN_MASK; =20 - trace_qio_channel_websock_encode(ioc, opcode, header_size, buffer->off= set); - buffer_reserve(output, header_size + buffer->offset); - buffer_append(output, header.buf, header_size); - buffer_append(output, buffer->buffer, buffer->offset); + trace_qio_channel_websock_encode(ioc, opcode, header_size, size); + buffer_reserve(&ioc->encoutput, header_size + size); + buffer_append(&ioc->encoutput, header.buf, header_size); + for (i =3D 0; i < niov && size !=3D 0; i++) { + size_t want =3D iov->iov_len; + if (want > size) { + want =3D size; + } + buffer_append(&ioc->encoutput, iov->iov_base, want); + size -=3D want; + } } =20 =20 @@ -622,6 +631,7 @@ static ssize_t qio_channel_websock_write_wire(QIOChanne= lWebsock *, Error **); static void qio_channel_websock_write_close(QIOChannelWebsock *ioc, uint16_t code, const char *rea= son) { + struct iovec iov; buffer_reserve(&ioc->rawoutput, 2 + (reason ? strlen(reason) : 0)); *(uint16_t *)(ioc->rawoutput.buffer + ioc->rawoutput.offset) =3D cpu_to_be16(code); @@ -629,9 +639,10 @@ static void qio_channel_websock_write_close(QIOChannel= Websock *ioc, if (reason) { buffer_append(&ioc->rawoutput, reason, strlen(reason)); } - qio_channel_websock_encode_buffer( - ioc, &ioc->encoutput, QIO_CHANNEL_WEBSOCK_OPCODE_CLOSE, - &ioc->rawoutput); + iov.iov_base =3D ioc->rawoutput.buffer; + iov.iov_len =3D ioc->rawoutput.offset; + qio_channel_websock_encode(ioc, QIO_CHANNEL_WEBSOCK_OPCODE_CLOSE, + &iov, 1, iov.iov_len); buffer_reset(&ioc->rawoutput); qio_channel_websock_write_wire(ioc, NULL); qio_channel_shutdown(ioc->master, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); @@ -801,9 +812,10 @@ static int qio_channel_websock_decode_payload(QIOChann= elWebsock *ioc, error_setg(errp, "websocket closed by peer"); if (payload_len) { /* echo client status */ - qio_channel_websock_encode_buffer( - ioc, &ioc->encoutput, QIO_CHANNEL_WEBSOCK_OPCODE_CLOSE, - &ioc->encinput); + struct iovec iov =3D { .iov_base =3D ioc->encinput.buffer, + .iov_len =3D ioc->encinput.offset }; + qio_channel_websock_encode(ioc, QIO_CHANNEL_WEBSOCK_OPCODE_CLO= SE, + &iov, 1, iov.iov_len); qio_channel_websock_write_wire(ioc, NULL); qio_channel_shutdown(ioc->master, QIO_CHANNEL_SHUTDOWN_BOTH, N= ULL); } else { @@ -816,9 +828,10 @@ static int qio_channel_websock_decode_payload(QIOChann= elWebsock *ioc, /* ping frames produce an immediate reply, as long as we've not st= ill * got a previous ping queued, in which case we drop the new pong = */ if (ioc->ping_remain =3D=3D 0) { - qio_channel_websock_encode_buffer( - ioc, &ioc->encoutput, QIO_CHANNEL_WEBSOCK_OPCODE_PONG, - &ioc->encinput); + struct iovec iov =3D { .iov_base =3D ioc->encinput.buffer, + .iov_len =3D ioc->encinput.offset }; + qio_channel_websock_encode(ioc, QIO_CHANNEL_WEBSOCK_OPCODE_PON= G, + &iov, 1, iov.iov_len); ioc->ping_remain =3D ioc->encoutput.offset; } } /* pong frames are ignored */ @@ -1120,11 +1133,13 @@ static ssize_t qio_channel_websock_writev(QIOChanne= l *ioc, } =20 done: - if (ioc->rawoutput.offset) { - qio_channel_websock_encode_buffer( - ioc, &ioc->encoutput, QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME, - &ioc->rawoutput); - buffer_reset(&ioc->rawoutput); + if (wioc->rawoutput.offset) { + struct iovec iov =3D { .iov_base =3D wioc->rawoutput.buffer, + .iov_len =3D wioc->rawoutput.offset }; + qio_channel_websock_encode(wioc, + QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME, + &iov, 1, iov.iov_len); + buffer_reset(&wioc->rawoutput); } ret =3D qio_channel_websock_write_wire(wioc, errp); if (ret < 0 && --=20 2.13.5 From nobody Sat May 4 07:55:09 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507650436642401.0978337586498; Tue, 10 Oct 2017 08:47:16 -0700 (PDT) Received: from localhost ([::1]:35700 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1wkC-000591-Rb for importer@patchew.org; Tue, 10 Oct 2017 11:46:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47623) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1whB-0002fD-Fr for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1whA-00037o-HB for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:49 -0400 Received: from mx1.redhat.com ([209.132.183.28]:44138) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1whA-00037A-8n for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:48 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4B9123C5D for ; Tue, 10 Oct 2017 15:43:47 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.82]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3984868872; Tue, 10 Oct 2017 15:43:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 4B9123C5D Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=berrange@redhat.com From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 16:43:26 +0100 Message-Id: <20171010154328.8419-6-berrange@redhat.com> In-Reply-To: <20171010154328.8419-1-berrange@redhat.com> References: <20171010154328.8419-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 10 Oct 2017 15:43:47 +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] [PATCH v1 5/7] io: get rid of bounce buffering in websock write path 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Currently most outbound I/O on the websock channel gets copied into the rawoutput buffer, and then immediately copied again into the encoutput buffer, with a header prepended. Now that qio_channel_websock_encode accepts a struct iovec, we can trivially remove this bounce buffering and write directly to encoutput. In doing so, we also now correctly validate the encoutput size against the QIO_CHANNEL_WEBSOCK_MAX_BUFFER limit. Signed-off-by: Daniel P. Berrange --- include/io/channel-websock.h | 1 - io/channel-websock.c | 64 +++++++++++++++++++---------------------= ---- 2 files changed, 28 insertions(+), 37 deletions(-) diff --git a/include/io/channel-websock.h b/include/io/channel-websock.h index 3f92535cae..f2ac0fdad1 100644 --- a/include/io/channel-websock.h +++ b/include/io/channel-websock.h @@ -59,7 +59,6 @@ struct QIOChannelWebsock { Buffer encinput; Buffer encoutput; Buffer rawinput; - Buffer rawoutput; size_t payload_remain; size_t ping_remain; QIOChannelWebsockMask mask; diff --git a/io/channel-websock.c b/io/channel-websock.c index ad62dda479..455f5e322c 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -24,6 +24,7 @@ #include "io/channel-websock.h" #include "crypto/hash.h" #include "trace.h" +#include "qemu/iov.h" =20 #include =20 @@ -631,19 +632,22 @@ static ssize_t qio_channel_websock_write_wire(QIOChan= nelWebsock *, Error **); static void qio_channel_websock_write_close(QIOChannelWebsock *ioc, uint16_t code, const char *rea= son) { - struct iovec iov; - buffer_reserve(&ioc->rawoutput, 2 + (reason ? strlen(reason) : 0)); - *(uint16_t *)(ioc->rawoutput.buffer + ioc->rawoutput.offset) =3D - cpu_to_be16(code); - ioc->rawoutput.offset +=3D 2; + struct iovec iov[2] =3D { + { .iov_base =3D &code, .iov_len =3D sizeof(code) }, + }; + size_t niov =3D 1; + size_t size =3D iov[0].iov_len; + + cpu_to_be16s(&code); + if (reason) { - buffer_append(&ioc->rawoutput, reason, strlen(reason)); + iov[1].iov_base =3D (void *)reason; + iov[1].iov_len =3D strlen(reason); + size +=3D iov[1].iov_len; + niov++; } - iov.iov_base =3D ioc->rawoutput.buffer; - iov.iov_len =3D ioc->rawoutput.offset; qio_channel_websock_encode(ioc, QIO_CHANNEL_WEBSOCK_OPCODE_CLOSE, - &iov, 1, iov.iov_len); - buffer_reset(&ioc->rawoutput); + iov, niov, size); qio_channel_websock_write_wire(ioc, NULL); qio_channel_shutdown(ioc->master, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); } @@ -891,7 +895,6 @@ static void qio_channel_websock_finalize(Object *obj) buffer_free(&ioc->encinput); buffer_free(&ioc->encoutput); buffer_free(&ioc->rawinput); - buffer_free(&ioc->rawoutput); object_unref(OBJECT(ioc->master)); if (ioc->io_tag) { g_source_remove(ioc->io_tag); @@ -1101,8 +1104,8 @@ static ssize_t qio_channel_websock_writev(QIOChannel = *ioc, Error **errp) { QIOChannelWebsock *wioc =3D QIO_CHANNEL_WEBSOCK(ioc); - size_t i; - ssize_t done =3D 0; + ssize_t want =3D iov_size(iov, niov); + ssize_t avail; ssize_t ret; =20 if (wioc->io_err) { @@ -1115,32 +1118,21 @@ static ssize_t qio_channel_websock_writev(QIOChanne= l *ioc, return -1; } =20 - for (i =3D 0; i < niov; i++) { - size_t want =3D iov[i].iov_len; - if ((want + wioc->rawoutput.offset) > QIO_CHANNEL_WEBSOCK_MAX_BUFF= ER) { - want =3D (QIO_CHANNEL_WEBSOCK_MAX_BUFFER - wioc->rawoutput.off= set); - } - if (want =3D=3D 0) { - goto done; - } - - buffer_reserve(&wioc->rawoutput, want); - buffer_append(&wioc->rawoutput, iov[i].iov_base, want); - done +=3D want; - if (want < iov[i].iov_len) { - break; - } + avail =3D wioc->encoutput.offset >=3D QIO_CHANNEL_WEBSOCK_MAX_BUFFER ? + 0 : (QIO_CHANNEL_WEBSOCK_MAX_BUFFER - wioc->encoutput.offset); + if (want > avail) { + want =3D avail; } =20 - done: - if (wioc->rawoutput.offset) { - struct iovec iov =3D { .iov_base =3D wioc->rawoutput.buffer, - .iov_len =3D wioc->rawoutput.offset }; + if (want) { qio_channel_websock_encode(wioc, QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME, - &iov, 1, iov.iov_len); - buffer_reset(&wioc->rawoutput); + iov, niov, want); } + + /* Even if want =3D=3D 0, we'll try write_wire in case there's + * pending data we could usefully flush out + */ ret =3D qio_channel_websock_write_wire(wioc, errp); if (ret < 0 && ret !=3D QIO_CHANNEL_ERR_BLOCK) { @@ -1150,11 +1142,11 @@ static ssize_t qio_channel_websock_writev(QIOChanne= l *ioc, =20 qio_channel_websock_set_watch(wioc); =20 - if (done =3D=3D 0) { + if (want =3D=3D 0) { return QIO_CHANNEL_ERR_BLOCK; } =20 - return done; + return want; } =20 static int qio_channel_websock_set_blocking(QIOChannel *ioc, --=20 2.13.5 From nobody Sat May 4 07:55:09 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507650561467947.5326273299089; Tue, 10 Oct 2017 08:49:21 -0700 (PDT) Received: from localhost ([::1]:35707 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1wmS-0006r1-B4 for importer@patchew.org; Tue, 10 Oct 2017 11:49:16 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47640) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1whC-0002gD-Mn for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1whB-00038S-Vz for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:50 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41050) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1whB-000388-Q3 for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:49 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CCDCD9D0FE for ; Tue, 10 Oct 2017 15:43:48 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.82]) by smtp.corp.redhat.com (Postfix) with ESMTP id 957EA5C1A3; Tue, 10 Oct 2017 15:43:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com CCDCD9D0FE Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=berrange@redhat.com From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 16:43:27 +0100 Message-Id: <20171010154328.8419-7-berrange@redhat.com> In-Reply-To: <20171010154328.8419-1-berrange@redhat.com> References: <20171010154328.8419-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 10 Oct 2017 15:43:48 +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] [PATCH v1 6/7] io: cope with websock 'Connection' header having multiple values 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The noVNC server sends a header "Connection: keep-alive, Upgrade" which fails our simple equality test. Split the header on ',', trim whitespace and then check for 'upgrade' token. Signed-off-by: Daniel P. Berrange Reviewed-by: Eric Blake --- io/channel-websock.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/io/channel-websock.c b/io/channel-websock.c index 455f5e322c..a21915881d 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -374,6 +374,9 @@ static void qio_channel_websock_handshake_process(QIOCh= annelWebsock *ioc, size_t nhdrs =3D G_N_ELEMENTS(hdrs); const char *protocols =3D NULL, *version =3D NULL, *key =3D NULL, *host =3D NULL, *connection =3D NULL, *upgrade =3D NULL; + char **connectionv; + bool upgraded =3D false; + size_t i; =20 nhdrs =3D qio_channel_websock_extract_headers(ioc, buffer, hdrs, nhdrs= , errp); if (!nhdrs) { @@ -440,7 +443,16 @@ static void qio_channel_websock_handshake_process(QIOC= hannelWebsock *ioc, goto bad_request; } =20 - if (strcasecmp(connection, QIO_CHANNEL_WEBSOCK_CONNECTION_UPGRADE) != =3D 0) { + connectionv =3D g_strsplit(connection, ",", 0); + for (i =3D 0; connectionv !=3D NULL && connectionv[i] !=3D NULL; i++) { + g_strstrip(connectionv[i]); + if (strcasecmp(connectionv[i], + QIO_CHANNEL_WEBSOCK_CONNECTION_UPGRADE) =3D=3D 0) { + upgraded =3D true; + } + } + g_strfreev(connectionv); + if (!upgraded) { error_setg(errp, "No connection upgrade requested '%s'", connectio= n); goto bad_request; } --=20 2.13.5 From nobody Sat May 4 07:55:09 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507650706968529.8652294545456; Tue, 10 Oct 2017 08:51:46 -0700 (PDT) Received: from localhost ([::1]:35731 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1won-0000Lz-8d for importer@patchew.org; Tue, 10 Oct 2017 11:51:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47663) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1whE-0002i4-JX for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1whD-00039Y-Gw for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:52 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58216) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e1whD-00039G-AR for qemu-devel@nongnu.org; Tue, 10 Oct 2017 11:43:51 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5835E7EBD6 for ; Tue, 10 Oct 2017 15:43:50 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.82]) by smtp.corp.redhat.com (Postfix) with ESMTP id 649455C1A3; Tue, 10 Oct 2017 15:43:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 5835E7EBD6 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=berrange@redhat.com From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Tue, 10 Oct 2017 16:43:28 +0100 Message-Id: <20171010154328.8419-8-berrange@redhat.com> In-Reply-To: <20171010154328.8419-1-berrange@redhat.com> References: <20171010154328.8419-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 10 Oct 2017 15:43:50 +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] [PATCH v1 7/7] io: add trace points for websocket HTTP protocol headers 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Daniel P. Berrange Reviewed-by: Eric Blake --- io/channel-websock.c | 4 ++++ io/trace-events | 2 ++ 2 files changed, 6 insertions(+) diff --git a/io/channel-websock.c b/io/channel-websock.c index a21915881d..003d467715 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -224,6 +224,7 @@ qio_channel_websock_extract_headers(QIOChannelWebsock *= ioc, goto bad_request; } *nl =3D '\0'; + trace_qio_channel_websock_http_greeting(ioc, buffer); =20 tmp =3D strchr(buffer, ' '); if (!tmp) { @@ -425,6 +426,9 @@ static void qio_channel_websock_handshake_process(QIOCh= annelWebsock *ioc, goto bad_request; } =20 + trace_qio_channel_websock_http_request(ioc, protocols, version, + host, connection, upgrade, key); + if (!g_strrstr(protocols, QIO_CHANNEL_WEBSOCK_PROTOCOL_BINARY)) { error_setg(errp, "No '%s' protocol is supported by client '%s'", QIO_CHANNEL_WEBSOCK_PROTOCOL_BINARY, protocols); diff --git a/io/trace-events b/io/trace-events index 801b5dcb61..f70bad7cbe 100644 --- a/io/trace-events +++ b/io/trace-events @@ -48,6 +48,8 @@ qio_channel_websock_handshake_pending(void *ioc, int stat= us) "Websock handshake qio_channel_websock_handshake_reply(void *ioc) "Websock handshake reply io= c=3D%p" qio_channel_websock_handshake_fail(void *ioc, const char *msg) "Websock ha= ndshake fail ioc=3D%p err=3D%s" qio_channel_websock_handshake_complete(void *ioc) "Websock handshake compl= ete ioc=3D%p" +qio_channel_websock_http_greeting(void *ioc, const char *greeting) "Websoc= ket HTTP request ioc=3D%p greeting=3D'%s'" +qio_channel_websock_http_request(void *ioc, const char *protocols, const c= har *version, const char *host, const char *connection, const char *upgrade= , const char *key) "Websocket HTTP request ioc=3D%p protocols=3D'%s' versio= n=3D'%s' host=3D'%s' connection=3D'%s' upgrade=3D'%s' key=3D'%s'" qio_channel_websock_header_partial_decode(void *ioc, size_t payloadlen, un= signed char fin, unsigned char opcode, unsigned char has_mask) "Websocket h= eader decoded ioc=3D%p payload-len=3D%zu fin=3D0x%x opcode=3D0x%x has_mask= =3D0x%x" qio_channel_websock_header_full_decode(void *ioc, size_t headerlen, size_t= payloadlen, uint32_t mask) "Websocket header decoded ioc=3D%p header-len= =3D%zu payload-len=3D%zu mask=3D0x%x" qio_channel_websock_payload_decode(void *ioc, uint8_t opcode, size_t paylo= ad_remain) "Websocket header decoded ioc=3D%p opcode=3D0x%x payload-remain= =3D%zu" --=20 2.13.5