Skip to content

Commit

Permalink
io: fix decoding when multiple websockets frames arrive at once
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
berrange committed Feb 28, 2017
1 parent 8f2d7c3 commit cd892a2
Showing 1 changed file with 14 additions and 14 deletions.
28 changes: 14 additions & 14 deletions io/channel-websock.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}


Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit cd892a2

Please sign in to comment.