diff options
| author | Benjamin Tissoires <benjamin.tissoires@redhat.com> | 2014-08-22 16:16:05 -0400 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2014-08-25 03:59:51 -0400 |
| commit | 5abfe85c1d4694d5d4bbd13ecc166262b937adf0 (patch) | |
| tree | 56c7163e23cd55f49bbcb128d2bfa60a46aa67d9 | |
| parent | 4ab25786c87eb20857bbb715c3ae34ec8fd6a214 (diff) | |
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: ad3e14d7c5268c2e24477c6ef54bbdf88add5d36
Cc: stable@vger.kernel.org
Reported-and-tested-by: Markus Trippelsdorf <markus@trippelsdorf.de>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
| -rw-r--r-- | drivers/hid/hid-logitech-dj.c | 43 | ||||
| -rw-r--r-- | drivers/hid/hid-logitech-dj.h | 1 |
2 files changed, 26 insertions, 18 deletions
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c index b7ba82960c79..9bf8637747a5 100644 --- a/drivers/hid/hid-logitech-dj.c +++ b/drivers/hid/hid-logitech-dj.c | |||
| @@ -656,7 +656,6 @@ static int logi_dj_raw_event(struct hid_device *hdev, | |||
| 656 | struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); | 656 | struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); |
| 657 | struct dj_report *dj_report = (struct dj_report *) data; | 657 | struct dj_report *dj_report = (struct dj_report *) data; |
| 658 | unsigned long flags; | 658 | unsigned long flags; |
| 659 | bool report_processed = false; | ||
| 660 | 659 | ||
| 661 | dbg_hid("%s, size:%d\n", __func__, size); | 660 | dbg_hid("%s, size:%d\n", __func__, size); |
| 662 | 661 | ||
| @@ -683,34 +682,42 @@ static int logi_dj_raw_event(struct hid_device *hdev, | |||
| 683 | * device (via hid_input_report() ) and return 1 so hid-core does not do | 682 | * device (via hid_input_report() ) and return 1 so hid-core does not do |
| 684 | * anything else with it. | 683 | * anything else with it. |
| 685 | */ | 684 | */ |
| 685 | |||
| 686 | /* case 1) */ | ||
| 687 | if (data[0] != REPORT_ID_DJ_SHORT) | ||
| 688 | return false; | ||
| 689 | |||
| 686 | if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || | 690 | if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || |
| 687 | (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { | 691 | (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { |
| 688 | dev_err(&hdev->dev, "%s: invalid device index:%d\n", | 692 | /* |
| 693 | * Device index is wrong, bail out. | ||
| 694 | * This driver can ignore safely the receiver notifications, | ||
| 695 | * so ignore those reports too. | ||
| 696 | */ | ||
| 697 | if (dj_report->device_index != DJ_RECEIVER_INDEX) | ||
| 698 | dev_err(&hdev->dev, "%s: invalid device index:%d\n", | ||
| 689 | __func__, dj_report->device_index); | 699 | __func__, dj_report->device_index); |
| 690 | return false; | 700 | return false; |
| 691 | } | 701 | } |
| 692 | 702 | ||
| 693 | spin_lock_irqsave(&djrcv_dev->lock, flags); | 703 | spin_lock_irqsave(&djrcv_dev->lock, flags); |
| 694 | if (dj_report->report_id == REPORT_ID_DJ_SHORT) { | 704 | switch (dj_report->report_type) { |
| 695 | switch (dj_report->report_type) { | 705 | case REPORT_TYPE_NOTIF_DEVICE_PAIRED: |
| 696 | case REPORT_TYPE_NOTIF_DEVICE_PAIRED: | 706 | case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: |
| 697 | case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: | 707 | logi_dj_recv_queue_notification(djrcv_dev, dj_report); |
| 698 | logi_dj_recv_queue_notification(djrcv_dev, dj_report); | 708 | break; |
| 699 | break; | 709 | case REPORT_TYPE_NOTIF_CONNECTION_STATUS: |
| 700 | case REPORT_TYPE_NOTIF_CONNECTION_STATUS: | 710 | if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == |
| 701 | if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == | 711 | STATUS_LINKLOSS) { |
| 702 | STATUS_LINKLOSS) { | 712 | logi_dj_recv_forward_null_report(djrcv_dev, dj_report); |
| 703 | logi_dj_recv_forward_null_report(djrcv_dev, dj_report); | ||
| 704 | } | ||
| 705 | break; | ||
| 706 | default: | ||
| 707 | logi_dj_recv_forward_report(djrcv_dev, dj_report); | ||
| 708 | } | 713 | } |
| 709 | report_processed = true; | 714 | break; |
| 715 | default: | ||
| 716 | logi_dj_recv_forward_report(djrcv_dev, dj_report); | ||
| 710 | } | 717 | } |
| 711 | spin_unlock_irqrestore(&djrcv_dev->lock, flags); | 718 | spin_unlock_irqrestore(&djrcv_dev->lock, flags); |
| 712 | 719 | ||
| 713 | return report_processed; | 720 | return true; |
| 714 | } | 721 | } |
| 715 | 722 | ||
| 716 | static int logi_dj_probe(struct hid_device *hdev, | 723 | static int logi_dj_probe(struct hid_device *hdev, |
diff --git a/drivers/hid/hid-logitech-dj.h b/drivers/hid/hid-logitech-dj.h index 4a4000340ce1..daeb0aa4bee9 100644 --- a/drivers/hid/hid-logitech-dj.h +++ b/drivers/hid/hid-logitech-dj.h | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | 27 | ||
| 28 | #define DJ_MAX_PAIRED_DEVICES 6 | 28 | #define DJ_MAX_PAIRED_DEVICES 6 |
| 29 | #define DJ_MAX_NUMBER_NOTIFICATIONS 8 | 29 | #define DJ_MAX_NUMBER_NOTIFICATIONS 8 |
| 30 | #define DJ_RECEIVER_INDEX 0 | ||
| 30 | #define DJ_DEVICE_INDEX_MIN 1 | 31 | #define DJ_DEVICE_INDEX_MIN 1 |
| 31 | #define DJ_DEVICE_INDEX_MAX 6 | 32 | #define DJ_DEVICE_INDEX_MAX 6 |
| 32 | 33 | ||
