From 32ab216c8559f225626c6388c9c0e1ef26392715 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 25 May 2008 22:29:41 +0000 Subject: [PATCH] * Check for the removed case before doing any transfers. * Cancel possibly active transfers when removed. * Do not interpret the transfer buffer in case of an error or removal. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25658 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/drivers/input/usb_hid/HIDDevice.cpp | 3 +++ .../drivers/input/usb_hid/KeyboardDevice.cpp | 14 ++++++++++++++ .../kernel/drivers/input/usb_hid/MouseDevice.cpp | 11 +++++++++++ 3 files changed, 28 insertions(+) diff --git a/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp b/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp index 0fc4587b39..0ce7dc4a43 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp +++ b/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp @@ -275,6 +275,7 @@ void HIDDevice::Removed() { fRemoved = true; + gUSBModule->cancel_queued_transfers(fInterruptPipe); } @@ -297,6 +298,8 @@ HIDDevice::_ScheduleTransfer() { if (fTransferUnprocessed) return B_BUSY; + if (fRemoved) + return B_ERROR; status_t result = gUSBModule->queue_interrupt(fInterruptPipe, fTransferBuffer, fTotalReportSize, _TransferCallback, this); diff --git a/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp b/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp index 6527bf797e..c9458813f7 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp +++ b/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp @@ -106,6 +106,9 @@ KeyboardDevice::_WriteKey(uint32 key, bool down) status_t KeyboardDevice::_SetLEDs(uint8 *data) { + if (IsRemoved()) + return B_ERROR; + uint8 leds = 0; if (data[0] == 1) leds |= (1 << 0); @@ -126,6 +129,17 @@ KeyboardDevice::_SetLEDs(uint8 *data) status_t KeyboardDevice::_InterpretBuffer() { + if (fTransferStatus != B_OK) { + if (IsRemoved()) + return B_ERROR; + + if (gUSBModule->clear_feature(fInterruptPipe, + USB_FEATURE_ENDPOINT_HALT) != B_OK) + return B_ERROR; + + return B_OK; + } + static uint32 sModifierTable[] = { KEY_ControlL, KEY_ShiftL, diff --git a/src/add-ons/kernel/drivers/input/usb_hid/MouseDevice.cpp b/src/add-ons/kernel/drivers/input/usb_hid/MouseDevice.cpp index abc9ca1af2..8a4a07025c 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/MouseDevice.cpp +++ b/src/add-ons/kernel/drivers/input/usb_hid/MouseDevice.cpp @@ -78,6 +78,17 @@ MouseDevice::Control(uint32 op, void *buffer, size_t length) status_t MouseDevice::_InterpretBuffer() { + if (fTransferStatus != B_OK) { + if (IsRemoved()) + return B_ERROR; + + if (gUSBModule->clear_feature(fInterruptPipe, + USB_FEATURE_ENDPOINT_HALT) != B_OK) + return B_ERROR; + + return B_OK; + } + mouse_movement info; memset(&info, 0, sizeof(info)); for (size_t i = 0; i < fInstructionCount; i++) {