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


Reply via email to