aboutsummaryrefslogtreecommitdiff
path: root/drivers/hid/hid-logitech-dj.c
diff options
context:
space:
mode:
authorGravatar Nikita Zhandarovich <n.zhandarovich@fintech.ru> 2023-06-13 03:16:35 -0700
committerGravatar Benjamin Tissoires <bentiss@kernel.org> 2023-08-22 17:35:05 +0200
commit6f20d3261265885f6a6be4cda49d7019728760e0 (patch)
tree9ba32113f1aa71d487d33908c429aee86deac759 /drivers/hid/hid-logitech-dj.c
parentHID: logitech-hidpp: Add support for Logitech MX Anywhere 3 mouse (diff)
downloadlinux-6f20d3261265885f6a6be4cda49d7019728760e0.tar.gz
linux-6f20d3261265885f6a6be4cda49d7019728760e0.tar.bz2
linux-6f20d3261265885f6a6be4cda49d7019728760e0.zip
HID: logitech-dj: Fix error handling in logi_dj_recv_switch_to_dj_mode()
Presently, if a call to logi_dj_recv_send_report() fails, we do not learn about the error until after sending short HID_OUTPUT_REPORT with hid_hw_raw_request(). To handle this somewhat unlikely issue, return on error in logi_dj_recv_send_report() (minding ugly sleep workaround) and take into account the result of hid_hw_raw_request(). Found by Linux Verification Center (linuxtesting.org) with static analysis tool SVACE. Fixes: 6a9ddc897883 ("HID: logitech-dj: enable notifications on connect/disconnect") Signed-off-by: Nikita Zhandarovich <n.zhandarovich@fintech.ru> Link: https://lore.kernel.org/r/20230613101635.77820-1-n.zhandarovich@fintech.ru Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
Diffstat (limited to 'drivers/hid/hid-logitech-dj.c')
-rw-r--r--drivers/hid/hid-logitech-dj.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
index fef67da0de53..8afe3be683ba 100644
--- a/drivers/hid/hid-logitech-dj.c
+++ b/drivers/hid/hid-logitech-dj.c
@@ -1285,6 +1285,9 @@ static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
* 50 msec should gives enough time to the receiver to be ready.
*/
msleep(50);
+
+ if (retval)
+ return retval;
}
/*
@@ -1306,7 +1309,7 @@ static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
buf[5] = 0x09;
buf[6] = 0x00;
- hid_hw_raw_request(hdev, REPORT_ID_HIDPP_SHORT, buf,
+ retval = hid_hw_raw_request(hdev, REPORT_ID_HIDPP_SHORT, buf,
HIDPP_REPORT_SHORT_LENGTH, HID_OUTPUT_REPORT,
HID_REQ_SET_REPORT);