X-Git-Url: https://repo.jachan.dev/qemu.git/blobdiff_plain/dabc50e4c68c1be046d4a42908af0f9df69f910a..a3a683c33d38fb29c7a78903e88dda12b84cc88d:/io/channel-websock.c diff --git a/io/channel-websock.c b/io/channel-websock.c index df2c3a9f99..77d30f0e4a 100644 --- a/io/channel-websock.c +++ b/io/channel-websock.c @@ -26,9 +26,6 @@ #include "trace.h" #include "qemu/iov.h" -#include - - /* Max amount to allow in rawinput/encoutput buffers */ #define QIO_CHANNEL_WEBSOCK_MAX_BUFFER 8192 @@ -152,9 +149,10 @@ enum { QIO_CHANNEL_WEBSOCK_OPCODE_PONG = 0xA }; -static void qio_channel_websock_handshake_send_res(QIOChannelWebsock *ioc, - const char *resmsg, - ...) +static void GCC_FMT_ATTR(2, 3) +qio_channel_websock_handshake_send_res(QIOChannelWebsock *ioc, + const char *resmsg, + ...) { va_list vargs; char *response; @@ -165,6 +163,7 @@ static void qio_channel_websock_handshake_send_res(QIOChannelWebsock *ioc, responselen = strlen(response); buffer_reserve(&ioc->encoutput, responselen); buffer_append(&ioc->encoutput, response, responselen); + g_free(response); va_end(vargs); } @@ -501,9 +500,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'; @@ -585,9 +587,7 @@ static gboolean qio_channel_websock_handshake_io(QIOChannel *ioc, return TRUE; } - if (err) { - error_propagate(&wioc->io_err, err); - } + error_propagate(&wioc->io_err, err); trace_qio_channel_websock_handshake_reply(ioc); qio_channel_add_watch( @@ -1225,12 +1225,18 @@ qio_channel_websock_source_check(GSource *source) QIOChannelWebsockSource *wsource = (QIOChannelWebsockSource *)source; GIOCondition cond = 0; - if (wsource->wioc->rawinput.offset || wsource->wioc->io_eof) { + if (wsource->wioc->rawinput.offset) { cond |= G_IO_IN; } if (wsource->wioc->encoutput.offset < QIO_CHANNEL_WEBSOCK_MAX_BUFFER) { cond |= G_IO_OUT; } + if (wsource->wioc->io_eof) { + cond |= G_IO_HUP; + } + if (wsource->wioc->io_err) { + cond |= G_IO_ERR; + } return cond & wsource->condition; }