On Fri, Oct 03, 2025 at 04:02:44PM +0100, Daniel P. Berrangé wrote: > The QIOChannelWebsock object releases all its resources in the > finalize callback. This is later than desired, as callers expect > to be able to call qio_channel_close() to fully close a channel > and release resources related to I/O. > > The logic in the finalize method is at most a failsafe to handle > cases where a consumer forgets to call qio_channel_close. > > This adds equivalent logic to the close method to release the > resources, using g_clear_handle_id/g_clear_pointer to be robust > against repeated invokations. The finalize method is tweaked
invocations > so that the GSource is removed before releasing the underlying > channel. > > Signed-off-by: Daniel P. Berrangé <[email protected]> > --- > io/channel-websock.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) Reviewed-by: Eric Blake <[email protected]> > > diff --git a/io/channel-websock.c b/io/channel-websock.c > index 0a8c5c4712..a50a160e18 100644 > --- a/io/channel-websock.c > +++ b/io/channel-websock.c > @@ -922,13 +922,13 @@ static void qio_channel_websock_finalize(Object *obj) > buffer_free(&ioc->encinput); > buffer_free(&ioc->encoutput); > buffer_free(&ioc->rawinput); > - object_unref(OBJECT(ioc->master)); > if (ioc->io_tag) { > g_source_remove(ioc->io_tag); > } > if (ioc->io_err) { > error_free(ioc->io_err); > } > + object_unref(OBJECT(ioc->master)); > } > > > @@ -1218,6 +1218,15 @@ static int qio_channel_websock_close(QIOChannel *ioc, > QIOChannelWebsock *wioc = QIO_CHANNEL_WEBSOCK(ioc); > > trace_qio_channel_websock_close(ioc); > + buffer_free(&wioc->encinput); > + buffer_free(&wioc->encoutput); > + buffer_free(&wioc->rawinput); > + if (wioc->io_tag) { > + g_clear_handle_id(&wioc->io_tag, g_source_remove); > + } > + if (wioc->io_err) { > + g_clear_pointer(&wioc->io_err, error_free); > + } > return qio_channel_close(wioc->master, errp); > } > > -- > 2.50.1 > > -- Eric Blake, Principal Software Engineer Red Hat, Inc. Virtualization: qemu.org | libguestfs.org
