Fix logitech-dj HID bug from Benjamin Tissoires (rhbz 840391)

This commit is contained in:
Josh Boyer 2013-03-07 13:10:52 -05:00
parent 86ce060b46
commit 39198815d8
2 changed files with 73 additions and 0 deletions

View File

@ -741,6 +741,9 @@ Patch22265: crypto-user-fix-info-leaks-in-report-API.patch
# CVE-2013-1792 rhbz 916646,919021
Patch22266: keys-fix-race-with-concurrent-install_user_keyrings.patch
#rhbz 840391
Patch22267: logitech-dj-do-not-directly-call-hid_output_raw_report-during-probe.patch
#rhbz 812111
Patch24000: alps.patch
@ -1458,6 +1461,9 @@ ApplyPatch fix-destroy_conntrack-GPF.patch
# CVE-2013-1792 rhbz 916646,919021
ApplyPatch keys-fix-race-with-concurrent-install_user_keyrings.patch
#rhbz 840391
ApplyPatch logitech-dj-do-not-directly-call-hid_output_raw_report-during-probe.patch
# END OF PATCH APPLICATIONS
%endif
@ -2315,6 +2321,7 @@ fi
# '-'
%changelog
* Thu Mar 07 2013 Josh Boyer <jwboyer@redhat.com>
- Fix logitech-dj HID bug from Benjamin Tissoires (rhbz 840391)
- CVE-2013-1792 keys: race condition in install_user_keyrings (rhbz 916646 919021)
* Wed Mar 06 2013 Justin M. Forbes <jforbes@redhat.com>

View File

@ -0,0 +1,66 @@
From dcd9006b1b053c7b1cebe81333261d4fd492ffeb Mon Sep 17 00:00:00 2001
From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Date: Tue, 05 Mar 2013 16:09:00 +0000
Subject: HID: logitech-dj: do not directly call hid_output_raw_report() during probe
hid_output_raw_report() makes a direct call to usb_control_msg(). However,
some USB3 boards have shown that the usb device is not ready during the
.probe(). This blocks the entire usb device, and the paired mice, keyboards
are not functional. The dmesg output is the following:
[ 11.912287] logitech-djreceiver 0003:046D:C52B.0003: hiddev0,hidraw0: USB HID v1.11 Device [Logitech USB Receiver] on usb-0000:00:14.0-2/input2
[ 11.912537] logitech-djreceiver 0003:046D:C52B.0003: logi_dj_probe:logi_dj_recv_query_paired_devices error:-32
[ 11.912636] logitech-djreceiver: probe of 0003:046D:C52B.0003 failed with error -32
Relying on the scheduled call to usbhid_submit_report() fixes the problem.
related bugs:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1072082
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1039143
https://bugzilla.redhat.com/show_bug.cgi?id=840391
https://bugzilla.kernel.org/show_bug.cgi?id=49781
Reported-and-tested-by: Bob Bowles <bobjohnbowles@gmail.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
---
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
index 9500f2f..8758f38c 100644
--- a/drivers/hid/hid-logitech-dj.c
+++ b/drivers/hid/hid-logitech-dj.c
@@ -459,19 +459,25 @@ static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev,
struct dj_report *dj_report)
{
struct hid_device *hdev = djrcv_dev->hdev;
- int sent_bytes;
+ struct hid_report *report;
+ struct hid_report_enum *output_report_enum;
+ u8 *data = (u8 *)(&dj_report->device_index);
+ int i;
- if (!hdev->hid_output_raw_report) {
- dev_err(&hdev->dev, "%s:"
- "hid_output_raw_report is null\n", __func__);
+ output_report_enum = &hdev->report_enum[HID_OUTPUT_REPORT];
+ report = output_report_enum->report_id_hash[REPORT_ID_DJ_SHORT];
+
+ if (!report) {
+ dev_err(&hdev->dev, "%s: unable to find dj report\n", __func__);
return -ENODEV;
}
- sent_bytes = hdev->hid_output_raw_report(hdev, (u8 *) dj_report,
- sizeof(struct dj_report),
- HID_OUTPUT_REPORT);
+ for (i = 0; i < report->field[0]->report_count; i++)
+ report->field[0]->value[i] = data[i];
+
+ usbhid_submit_report(hdev, report, USB_DIR_OUT);
- return (sent_bytes < 0) ? sent_bytes : 0;
+ return 0;
}
static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
--
cgit v0.9.1