[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 5/7] io: Ignore websocket PING and PONG frames
From: |
Brandon Carpenter |
Subject: |
[Qemu-devel] [PATCH v3 5/7] io: Ignore websocket PING and PONG frames |
Date: |
Tue, 12 Sep 2017 08:21:51 -0700 |
Keep pings and gratuitous pongs generated by web browsers from killing
websocket connections.
Signed-off-by: Brandon Carpenter <address@hidden>
---
io/channel-websock.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/io/channel-websock.c b/io/channel-websock.c
index 3183aeff77..50387050d5 100644
--- a/io/channel-websock.c
+++ b/io/channel-websock.c
@@ -86,6 +86,7 @@
#define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_OPCODE 0x0f
#define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_HAS_MASK 0x80
#define QIO_CHANNEL_WEBSOCK_HEADER_FIELD_PAYLOAD_LEN 0x7f
+#define QIO_CHANNEL_WEBSOCK_CONTROL_OPCODE_MASK 0x8
typedef struct QIOChannelWebsockHeader QIOChannelWebsockHeader;
@@ -565,8 +566,11 @@ static int
qio_channel_websock_decode_header(QIOChannelWebsock *ioc,
return -1;
}
} else {
- if (opcode != QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME) {
- error_setg(errp, "only binary websocket frames are supported");
+ if (opcode != QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME &&
+ opcode != QIO_CHANNEL_WEBSOCK_OPCODE_PING &&
+ opcode != QIO_CHANNEL_WEBSOCK_OPCODE_PONG) {
+ error_setg(errp, "unsupported opcode: %#04x; only binary, ping, "
+ "and pong websocket frames are supported",
opcode);
return -1;
}
}
@@ -579,6 +583,9 @@ static int
qio_channel_websock_decode_header(QIOChannelWebsock *ioc,
ioc->payload_remain = payload_len;
header_size = QIO_CHANNEL_WEBSOCK_HEADER_LEN_7_BIT;
ioc->mask = header->u.m;
+ } else if (opcode & QIO_CHANNEL_WEBSOCK_CONTROL_OPCODE_MASK) {
+ error_setg(errp, "websocket control frame is too large");
+ return -1;
} else if (payload_len == QIO_CHANNEL_WEBSOCK_PAYLOAD_LEN_MAGIC_16_BIT &&
ioc->encinput.offset >= QIO_CHANNEL_WEBSOCK_HEADER_LEN_16_BIT) {
ioc->payload_remain = be16_to_cpu(header->u.s16.l16);
@@ -634,9 +641,15 @@ static int
qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,
}
}
+ /* Drop the payload of ping/pong packets */
+ if (ioc->opcode == QIO_CHANNEL_WEBSOCK_OPCODE_BINARY_FRAME) {
+ if (payload_len) {
+ buffer_reserve(&ioc->rawinput, payload_len);
+ buffer_append(&ioc->rawinput, ioc->encinput.buffer, payload_len);
+ }
+ }
+
if (payload_len) {
- buffer_reserve(&ioc->rawinput, payload_len);
- buffer_append(&ioc->rawinput, ioc->encinput.buffer, payload_len);
buffer_advance(&ioc->encinput, payload_len);
}
return 0;
--
2.14.1
--
CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is
for the sole use of the intended recipient(s) and may contain proprietary,
confidential or privileged information or otherwise be protected by law.
Any unauthorized review, use, disclosure or distribution is prohibited. If
you are not the intended recipient, please notify the sender and destroy
all copies and the original message.
- [Qemu-devel] [PATCH v3 0/7] Update websocket code to more fully support the RFC, Brandon Carpenter, 2017/09/12
- [Qemu-devel] [PATCH v3 3/7] io: Add support for fragmented websocket binary frames, Brandon Carpenter, 2017/09/12
- [Qemu-devel] [PATCH v3 2/7] io: Small updates in preparation for websocket changes, Brandon Carpenter, 2017/09/12
- [Qemu-devel] [PATCH v3 1/7] io: Always remove an old channel watch before adding a new one, Brandon Carpenter, 2017/09/12
- [Qemu-devel] [PATCH v3 4/7] io: Allow empty websocket payload, Brandon Carpenter, 2017/09/12
- [Qemu-devel] [PATCH v3 7/7] io: Attempt to send websocket close messages to client, Brandon Carpenter, 2017/09/12
- [Qemu-devel] [PATCH v3 6/7] io: Reply to ping frames, Brandon Carpenter, 2017/09/12
- [Qemu-devel] [PATCH v3 5/7] io: Ignore websocket PING and PONG frames,
Brandon Carpenter <=
- Re: [Qemu-devel] [PATCH v3 0/7] Update websocket code to more fully support the RFC, Stefan Hajnoczi, 2017/09/18
- Re: [Qemu-devel] [PATCH v3 0/7] Update websocket code to more fully support the RFC, Brandon Carpenter, 2017/09/20