From cd8b436566a26a34758632b567e5c205eb327f74 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 10 Nov 2020 14:09:58 +0100 Subject: [PATCH] usb_hid: avoid destruction of used signal handler Fixes #3945 --- repos/dde_linux/src/drivers/usb_hid/driver.h | 5 +++++ repos/dde_linux/src/drivers/usb_hid/main.cc | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/repos/dde_linux/src/drivers/usb_hid/driver.h b/repos/dde_linux/src/drivers/usb_hid/driver.h index e463e5bbac..a3acc44d26 100644 --- a/repos/dde_linux/src/drivers/usb_hid/driver.h +++ b/repos/dde_linux/src/drivers/usb_hid/driver.h @@ -33,11 +33,14 @@ struct Driver { Lx::Task task; Genode::Signal_handler handler; + bool handling_signal { false }; void handle_signal() { task.unblock(); + handling_signal = true; Lx::scheduler().schedule(); + handling_signal = false; } template @@ -56,6 +59,7 @@ struct Driver Genode::Allocator_avl &alloc; Task state_task; Task urb_task; + Usb::Connection usb { env, &alloc, label.string(), 512 * 1024, state_task.handler }; usb_device * udev = nullptr; @@ -70,6 +74,7 @@ struct Driver void unregister_device(); void probe_interface(usb_interface *, usb_device_id *); void remove_interface(usb_interface *); + bool deinit(); }; struct Devices : Genode::List diff --git a/repos/dde_linux/src/drivers/usb_hid/main.cc b/repos/dde_linux/src/drivers/usb_hid/main.cc index 32d062d860..35189b7639 100644 --- a/repos/dde_linux/src/drivers/usb_hid/main.cc +++ b/repos/dde_linux/src/drivers/usb_hid/main.cc @@ -142,7 +142,14 @@ Driver::Device::Device(Driver & driver, Label label) Driver::Device::~Device() { driver.devices.remove(&le); +} + + +bool Driver::Device::deinit() +{ if (udev) unregister_device(); + + return !udev && !state_task.handling_signal && !urb_task.handling_signal; } @@ -228,7 +235,9 @@ void Driver::scan_report() }; devices.for_each([&] (Device & d) { - if (!d.updated) destroy(heap, &d); }); + if (!d.updated && d.deinit()) + destroy(heap, &d); + }); }