From 09af690ea4ffcf6bca32c7b78583f5e2177db46b Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 22 Apr 2025 12:34:47 -0400 Subject: [PATCH] HID: Handle report waiting interruptions properly. B_INTERRUPTED is already used by the report processing code, instead return B_CANCELED and handle this specially. Fixes #19530. --- src/add-ons/kernel/drivers/input/hid_shared/HIDReport.cpp | 3 ++- src/add-ons/kernel/drivers/input/hid_shared/KeyboardProtocolHandler.cpp | 2 +- src/add-ons/kernel/drivers/input/hid_shared/MouseProtocolHandler.cpp | 2 +- src/add-ons/kernel/drivers/input/hid_shared/TabletProtocolHandler.cpp | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/drivers/input/hid_shared/HIDReport.cpp b/src/add-ons/kernel/drivers/input/hid_shared/HIDReport.cpp index 3aca229..1008dcb 100644 --- a/src/add-ons/kernel/drivers/input/hid_shared/HIDReport.cpp +++ b/src/add-ons/kernel/drivers/input/hid_shared/HIDReport.cpp @@ -235,12 +235,13 @@ status_t result = fParser->Device()->MaybeScheduleTransfer(this); if (result != B_OK) { TRACE_ALWAYS("scheduling transfer failed\n"); - conditionVariableEntry.Wait(B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, 0); return result; } result = conditionVariableEntry.Wait(B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, timeout); TRACE("waiting for report returned with result: %s\n", strerror(result)); + if (result == B_INTERRUPTED) + return B_CANCELED; if (result != B_OK) return result; diff --git a/src/add-ons/kernel/drivers/input/hid_shared/KeyboardProtocolHandler.cpp b/src/add-ons/kernel/drivers/input/hid_shared/KeyboardProtocolHandler.cpp index 657880f..aaf627d 100644 --- a/src/add-ons/kernel/drivers/input/hid_shared/KeyboardProtocolHandler.cpp +++ b/src/add-ons/kernel/drivers/input/hid_shared/KeyboardProtocolHandler.cpp @@ -514,7 +514,7 @@ return B_ERROR; } - if ((*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0) + if (result == B_CANCELED || (*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0) return B_CANCELED; if (result != B_TIMED_OUT && result != B_INTERRUPTED) { diff --git a/src/add-ons/kernel/drivers/input/hid_shared/MouseProtocolHandler.cpp b/src/add-ons/kernel/drivers/input/hid_shared/MouseProtocolHandler.cpp index df9810c..d46d888 100644 --- a/src/add-ons/kernel/drivers/input/hid_shared/MouseProtocolHandler.cpp +++ b/src/add-ons/kernel/drivers/input/hid_shared/MouseProtocolHandler.cpp @@ -192,7 +192,7 @@ return B_DEV_NOT_READY; } - if ((*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0) + if (result == B_CANCELED || (*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0) return B_CANCELED; if (result != B_INTERRUPTED) { diff --git a/src/add-ons/kernel/drivers/input/hid_shared/TabletProtocolHandler.cpp b/src/add-ons/kernel/drivers/input/hid_shared/TabletProtocolHandler.cpp index fda6725..a158d7d 100644 --- a/src/add-ons/kernel/drivers/input/hid_shared/TabletProtocolHandler.cpp +++ b/src/add-ons/kernel/drivers/input/hid_shared/TabletProtocolHandler.cpp @@ -242,7 +242,7 @@ return B_DEV_NOT_READY; } - if ((*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0) + if (result == B_CANCELED || (*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0) return B_CANCELED; if (result != B_INTERRUPTED) { -- gitore 0.2.3