The mouse device registers a QemuInputHandler during realize but
never unregisters it, leaking the handler on device removal.

Add an unrealize handler that calls
qemu_input_handler_unregister and chains to parent_unrealize
when present.

Fixes: 118e15191800 ("hw/input/adb-mouse: convert to use QemuInputHandler")
Signed-off-by: Marc-André Lureau <[email protected]>
---
 hw/input/adb-mouse.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/hw/input/adb-mouse.c b/hw/input/adb-mouse.c
index f9f989930ba1..0f2ecf0fd88c 100644
--- a/hw/input/adb-mouse.c
+++ b/hw/input/adb-mouse.c
@@ -51,6 +51,7 @@ struct ADBMouseClass {
     /*< private >*/
 
     DeviceRealize parent_realize;
+    DeviceUnrealize parent_unrealize;
 };
 
 #define ADB_MOUSE_BUTTON_LEFT   0x01
@@ -285,6 +286,17 @@ static void adb_mouse_realizefn(DeviceState *dev, Error 
**errp)
     s->hs = qemu_input_handler_register(dev, &adb_mouse_handler);
 }
 
+static void adb_mouse_unrealizefn(DeviceState *dev)
+{
+    MouseState *s = ADB_MOUSE(dev);
+    ADBMouseClass *amc = ADB_MOUSE_GET_CLASS(dev);
+
+    g_clear_pointer(&s->hs, qemu_input_handler_unregister);
+    if (amc->parent_unrealize) {
+        amc->parent_unrealize(dev);
+    }
+}
+
 static void adb_mouse_initfn(Object *obj)
 {
     ADBDevice *d = ADB_DEVICE(obj);
@@ -300,6 +312,8 @@ static void adb_mouse_class_init(ObjectClass *oc, const 
void *data)
 
     device_class_set_parent_realize(dc, adb_mouse_realizefn,
                                     &amc->parent_realize);
+    device_class_set_parent_unrealize(dc, adb_mouse_unrealizefn,
+                                      &amc->parent_unrealize);
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 
     adc->devreq = adb_mouse_request;

-- 
2.56.0.rc0.29.g47ce80527c56


Reply via email to