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