Commit 3a29640e authored by Brandon Carpenter's avatar Brandon Carpenter Committed by Daniel P. Berrangé
Browse files

io: Allow empty websocket payload



Some browsers send pings/pongs with no payload, so allow empty payloads
instead of closing the connection.

Signed-off-by: default avatarBrandon Carpenter <brandon.carpenter@cypherpath.com>
Signed-off-by: default avatarDaniel P. Berrange <berrange@redhat.com>
parent ff1300e6
Loading
Loading
Loading
Loading
+30 −32
Original line number Diff line number Diff line
@@ -697,15 +697,10 @@ static int qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,
                                              Error **errp)
{
    size_t i;
    size_t payload_len;
    size_t payload_len = 0;
    uint32_t *payload32;

    if (!ioc->payload_remain) {
        error_setg(errp,
                   "Decoding payload but no bytes of payload remain");
        return -1;
    }

    if (ioc->payload_remain) {
        /* If we aren't at the end of the payload, then drop
         * off the last bytes, so we're always multiple of 4
         * for purpose of unmasking, except at end of payload
@@ -731,10 +726,13 @@ static int qio_channel_websock_decode_payload(QIOChannelWebsock *ioc,
        for (i *= 4; i < payload_len; i++) {
            ioc->encinput.buffer[i] ^= ioc->mask.c[i % 4];
        }
    }

    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;
}