Commit a46ded1d authored by Edgar Kaziakhmedov's avatar Edgar Kaziakhmedov Committed by Daniel P. Berrangé
Browse files

io/channel-websock: handle continuous reads without any data



According to the current implementation of websocket protocol in QEMU,
qio_channel_websock_handshake_io tries to read handshake from the
channel to start communication over socket. But this approach
doesn't cover scenario when socket was closed while handshaking.
Therefore, if G_IO_IN is caught and qio_channel_read returns zero,
error has to be set and connection has to be done.

Such behaviour causes 100% CPU load in main QEMU loop, because main loop
poll continues to receive and handle G_IO_IN events from websocket.

Step to reproduce 100% CPU load:
1) start qemu with the simplest configuration
$ qemu -vnc [::1]:1,websocket=7500
2) open any vnc listener (which doesn't follow websocket
protocol)
$ vncviewer :7500
3) kill listener
4) qemu main thread eats 100% CPU

Signed-off-by: default avatarEdgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com>
Signed-off-by: default avatarDaniel P. Berrange <berrange@redhat.com>
parent 28bb0a59
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -499,9 +499,12 @@ static int qio_channel_websock_handshake_read(QIOChannelWebsock *ioc,
            error_setg(errp,
                       "End of headers not found in first 4096 bytes");
            return 1;
        } else {
            return 0;
        } else if (ret == 0) {
            error_setg(errp,
                       "End of headers not found before connection closed");
            return -1;
        }
        return 0;
    }
    *handshake_end = '\0';