Commit f378a25b16 for qemu.org
commit f378a25b1646d33922af75aa7ea059b2123cfb13
Author: Philippe Mathieu-Daudé <philmd@linaro.org>
Date: Wed Apr 8 11:50:18 2026 +0200
io: Clear dangling GLib event source tag
Following commit 34aad589019 ("hw/char/virtio-console: clear
dangling GLib event source tag"), prevent stale tags from
being reused by clearing dangling GLib event source tag during
the cleanup phase (finalize, unrealize).
Inspired-by: Matthew Penney <matt@matthewpenney.net>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Matthew Penney <matt@matthewpenney.net>
Message-Id: <20260408100605.66795-2-philmd@linaro.org>
diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
index fda5bbca67..100afbdb06 100644
--- a/hw/usb/redirect.c
+++ b/hw/usb/redirect.c
@@ -1494,9 +1494,7 @@ static void usbredir_unrealize(USBDevice *udev)
if (dev->parser) {
usbredirparser_destroy(dev->parser);
}
- if (dev->watch) {
- g_source_remove(dev->watch);
- }
+ g_clear_handle_id(&dev->watch, g_source_remove);
free(dev->filter_rules);
qemu_del_vm_change_state_handler(dev->vmstate);
diff --git a/io/channel-websock.c b/io/channel-websock.c
index 85b22a8822..617d79c351 100644
--- a/io/channel-websock.c
+++ b/io/channel-websock.c
@@ -950,12 +950,8 @@ static void qio_channel_websock_finalize(Object *obj)
buffer_free(&ioc->encinput);
buffer_free(&ioc->encoutput);
buffer_free(&ioc->rawinput);
- if (ioc->hs_io_tag) {
- g_source_remove(ioc->hs_io_tag);
- }
- if (ioc->io_tag) {
- g_source_remove(ioc->io_tag);
- }
+ g_clear_handle_id(&ioc->hs_io_tag, g_source_remove);
+ g_clear_handle_id(&ioc->io_tag, g_source_remove);
error_free(ioc->io_err);
object_unref(OBJECT(ioc->master));
}
diff --git a/target/i386/kvm/tdx-quote-generator.c b/target/i386/kvm/tdx-quote-generator.c
index dee8334b27..002bc40c8a 100644
--- a/target/i386/kvm/tdx-quote-generator.c
+++ b/target/i386/kvm/tdx-quote-generator.c
@@ -74,10 +74,7 @@ static void encode_header(char *buf, size_t len, uint32_t size) {
static void tdx_generate_quote_cleanup(TdxGenerateQuoteTask *task)
{
timer_del(&task->timer);
-
- if (task->watch) {
- g_source_remove(task->watch);
- }
+ g_clear_handle_id(&task->watch, g_source_remove);
qio_channel_close(QIO_CHANNEL(task->sioc), NULL);
object_unref(OBJECT(task->sioc));