Commit 5abfe85c authored by Benjamin Tissoires's avatar Benjamin Tissoires Committed by Jiri Kosina

HID: logitech-dj: prevent false errors to be shown

Commit "HID: logitech: perform bounds checking on device_id early
enough" unfortunately leaks some errors to dmesg which are not real
ones:
- if the report is not a DJ one, then there is not point in checking
  the device_id
- the receiver (index 0) can also receive some notifications which
  can be safely ignored given the current implementation

Move out the test regarding the report_id and also discards
printing errors when the receiver got notified.

Fixes: ad3e14d7

Cc: stable@vger.kernel.org
Reported-and-tested-by: default avatarMarkus Trippelsdorf <markus@trippelsdorf.de>
Signed-off-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 4ab25786
...@@ -656,7 +656,6 @@ static int logi_dj_raw_event(struct hid_device *hdev, ...@@ -656,7 +656,6 @@ static int logi_dj_raw_event(struct hid_device *hdev,
struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
struct dj_report *dj_report = (struct dj_report *) data; struct dj_report *dj_report = (struct dj_report *) data;
unsigned long flags; unsigned long flags;
bool report_processed = false;
dbg_hid("%s, size:%d\n", __func__, size); dbg_hid("%s, size:%d\n", __func__, size);
...@@ -683,15 +682,25 @@ static int logi_dj_raw_event(struct hid_device *hdev, ...@@ -683,15 +682,25 @@ static int logi_dj_raw_event(struct hid_device *hdev,
* device (via hid_input_report() ) and return 1 so hid-core does not do * device (via hid_input_report() ) and return 1 so hid-core does not do
* anything else with it. * anything else with it.
*/ */
/* case 1) */
if (data[0] != REPORT_ID_DJ_SHORT)
return false;
if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) ||
(dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) {
/*
* Device index is wrong, bail out.
* This driver can ignore safely the receiver notifications,
* so ignore those reports too.
*/
if (dj_report->device_index != DJ_RECEIVER_INDEX)
dev_err(&hdev->dev, "%s: invalid device index:%d\n", dev_err(&hdev->dev, "%s: invalid device index:%d\n",
__func__, dj_report->device_index); __func__, dj_report->device_index);
return false; return false;
} }
spin_lock_irqsave(&djrcv_dev->lock, flags); spin_lock_irqsave(&djrcv_dev->lock, flags);
if (dj_report->report_id == REPORT_ID_DJ_SHORT) {
switch (dj_report->report_type) { switch (dj_report->report_type) {
case REPORT_TYPE_NOTIF_DEVICE_PAIRED: case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
...@@ -706,11 +715,9 @@ static int logi_dj_raw_event(struct hid_device *hdev, ...@@ -706,11 +715,9 @@ static int logi_dj_raw_event(struct hid_device *hdev,
default: default:
logi_dj_recv_forward_report(djrcv_dev, dj_report); logi_dj_recv_forward_report(djrcv_dev, dj_report);
} }
report_processed = true;
}
spin_unlock_irqrestore(&djrcv_dev->lock, flags); spin_unlock_irqrestore(&djrcv_dev->lock, flags);
return report_processed; return true;
} }
static int logi_dj_probe(struct hid_device *hdev, static int logi_dj_probe(struct hid_device *hdev,
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#define DJ_MAX_PAIRED_DEVICES 6 #define DJ_MAX_PAIRED_DEVICES 6
#define DJ_MAX_NUMBER_NOTIFICATIONS 8 #define DJ_MAX_NUMBER_NOTIFICATIONS 8
#define DJ_RECEIVER_INDEX 0
#define DJ_DEVICE_INDEX_MIN 1 #define DJ_DEVICE_INDEX_MIN 1
#define DJ_DEVICE_INDEX_MAX 6 #define DJ_DEVICE_INDEX_MAX 6
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment