On 2026/06/08 16:16, Marc-André Lureau wrote:
Reported-by: Akihiko Odaki <[email protected]>
Signed-off-by: Marc-AndrĂ© Lureau <[email protected]>
---
  ui/dbus-console.c | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/ui/dbus-console.c b/ui/dbus-console.c
index 0813a08f85e..f784ccbe572 100644
--- a/ui/dbus-console.c
+++ b/ui/dbus-console.c
@@ -53,6 +53,7 @@ struct _DBusDisplayConsole {
      guint last_x;
      guint last_y;
      Notifier mouse_mode_notifier;
+    QEMUPutLEDEntry *kbd_leds_updated;
  };
G_DEFINE_TYPE(DBusDisplayConsole,
@@ -152,6 +153,7 @@ dbus_display_console_dispose(GObject *object)
qemu_console_unregister_listener(&ddc->dcl);
      qemu_remove_mouse_mode_change_notifier(&ddc->mouse_mode_notifier);
+    qemu_remove_led_event_handler(ddc->kbd_leds_updated);

It is better to avoid call qemu_remove_led_event_handler() here because GObject.ObjectClass.dispose is documented as it may be run multiple times and qemu_remove_led_event_handler() will cause double free if that happens.

Regards,
Akihiko Odaki

      g_clear_object(&ddc->iface_touch);
      g_clear_object(&ddc->iface_mouse);
      g_clear_object(&ddc->iface_kbd);
@@ -578,7 +580,8 @@ dbus_display_console_new(DBusDisplay *display, QemuConsole 
*con)
ddc->kbd = qkbd_state_init(con);
      ddc->iface_kbd = qemu_dbus_display1_keyboard_skeleton_new();
-    qemu_add_led_event_handler(dbus_kbd_qemu_leds_updated, ddc);
+    ddc->kbd_leds_updated = qemu_add_led_event_handler(
+        dbus_kbd_qemu_leds_updated, ddc);
      g_object_connect(ddc->iface_kbd,
          "swapped-signal::handle-press", dbus_kbd_press, ddc,
          "swapped-signal::handle-release", dbus_kbd_release, ddc,



Reply via email to