aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2017-01-12 12:17:43 -0500
committerJiri Kosina <jkosina@suse.cz>2017-01-13 05:59:32 -0500
commit7a546af50eb78ab99840903083231eb635c8a566 (patch)
tree16e370ecc364cfb39cfcf6324351070199cad955
parent6d104af38b570d37aa32a5803b04c354f8ed513d (diff)
HID: corsair: fix control-transfer error handling
Make sure to check for short control transfers in order to avoid parsing uninitialised buffer data and leaking it to user space. Note that the backlight and macro-mode buffer constraints are kept as loose as possible in order to avoid any regressions should the current buffer sizes be larger than necessary. Fixes: 6f78193ee9ea ("HID: corsair: Add Corsair Vengeance K90 driver") Cc: stable <stable@vger.kernel.org> Signed-off-by: Johan Hovold <johan@kernel.org> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/hid-corsair.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/hid/hid-corsair.c b/drivers/hid/hid-corsair.c
index 5971907a23b1..c0303f61c26a 100644
--- a/drivers/hid/hid-corsair.c
+++ b/drivers/hid/hid-corsair.c
@@ -159,7 +159,7 @@ static enum led_brightness k90_backlight_get(struct led_classdev *led_cdev)
159 USB_DIR_IN | USB_TYPE_VENDOR | 159 USB_DIR_IN | USB_TYPE_VENDOR |
160 USB_RECIP_DEVICE, 0, 0, data, 8, 160 USB_RECIP_DEVICE, 0, 0, data, 8,
161 USB_CTRL_SET_TIMEOUT); 161 USB_CTRL_SET_TIMEOUT);
162 if (ret < 0) { 162 if (ret < 5) {
163 dev_warn(dev, "Failed to get K90 initial state (error %d).\n", 163 dev_warn(dev, "Failed to get K90 initial state (error %d).\n",
164 ret); 164 ret);
165 ret = -EIO; 165 ret = -EIO;
@@ -274,7 +274,7 @@ static ssize_t k90_show_macro_mode(struct device *dev,
274 USB_DIR_IN | USB_TYPE_VENDOR | 274 USB_DIR_IN | USB_TYPE_VENDOR |
275 USB_RECIP_DEVICE, 0, 0, data, 2, 275 USB_RECIP_DEVICE, 0, 0, data, 2,
276 USB_CTRL_SET_TIMEOUT); 276 USB_CTRL_SET_TIMEOUT);
277 if (ret < 0) { 277 if (ret < 1) {
278 dev_warn(dev, "Failed to get K90 initial mode (error %d).\n", 278 dev_warn(dev, "Failed to get K90 initial mode (error %d).\n",
279 ret); 279 ret);
280 ret = -EIO; 280 ret = -EIO;
@@ -351,7 +351,7 @@ static ssize_t k90_show_current_profile(struct device *dev,
351 USB_DIR_IN | USB_TYPE_VENDOR | 351 USB_DIR_IN | USB_TYPE_VENDOR |
352 USB_RECIP_DEVICE, 0, 0, data, 8, 352 USB_RECIP_DEVICE, 0, 0, data, 8,
353 USB_CTRL_SET_TIMEOUT); 353 USB_CTRL_SET_TIMEOUT);
354 if (ret < 0) { 354 if (ret < 8) {
355 dev_warn(dev, "Failed to get K90 initial state (error %d).\n", 355 dev_warn(dev, "Failed to get K90 initial state (error %d).\n",
356 ret); 356 ret);
357 ret = -EIO; 357 ret = -EIO;