diff options
author | Johan Hovold <johan@kernel.org> | 2017-01-12 12:17:42 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2017-01-13 05:59:31 -0500 |
commit | 6d104af38b570d37aa32a5803b04c354f8ed513d (patch) | |
tree | 12d05f8a1a9e82b925ff84113054ade36052c3cf | |
parent | a89af4abdf9b353cdd6f61afc0eaaac403304873 (diff) |
HID: corsair: fix DMA buffers on stack
Not all platforms support DMA to the stack, and specifically since v4.9
this is no longer supported on x86 with VMAP_STACK either.
Note that the macro-mode buffer was 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.c | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/drivers/hid/hid-corsair.c b/drivers/hid/hid-corsair.c index 717704e9ae07..5971907a23b1 100644 --- a/drivers/hid/hid-corsair.c +++ b/drivers/hid/hid-corsair.c | |||
@@ -148,7 +148,11 @@ static enum led_brightness k90_backlight_get(struct led_classdev *led_cdev) | |||
148 | struct usb_interface *usbif = to_usb_interface(dev->parent); | 148 | struct usb_interface *usbif = to_usb_interface(dev->parent); |
149 | struct usb_device *usbdev = interface_to_usbdev(usbif); | 149 | struct usb_device *usbdev = interface_to_usbdev(usbif); |
150 | int brightness; | 150 | int brightness; |
151 | char data[8]; | 151 | char *data; |
152 | |||
153 | data = kmalloc(8, GFP_KERNEL); | ||
154 | if (!data) | ||
155 | return -ENOMEM; | ||
152 | 156 | ||
153 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), | 157 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), |
154 | K90_REQUEST_STATUS, | 158 | K90_REQUEST_STATUS, |
@@ -158,16 +162,22 @@ static enum led_brightness k90_backlight_get(struct led_classdev *led_cdev) | |||
158 | if (ret < 0) { | 162 | if (ret < 0) { |
159 | 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", |
160 | ret); | 164 | ret); |
161 | return -EIO; | 165 | ret = -EIO; |
166 | goto out; | ||
162 | } | 167 | } |
163 | brightness = data[4]; | 168 | brightness = data[4]; |
164 | if (brightness < 0 || brightness > 3) { | 169 | if (brightness < 0 || brightness > 3) { |
165 | dev_warn(dev, | 170 | dev_warn(dev, |
166 | "Read invalid backlight brightness: %02hhx.\n", | 171 | "Read invalid backlight brightness: %02hhx.\n", |
167 | data[4]); | 172 | data[4]); |
168 | return -EIO; | 173 | ret = -EIO; |
174 | goto out; | ||
169 | } | 175 | } |
170 | return brightness; | 176 | ret = brightness; |
177 | out: | ||
178 | kfree(data); | ||
179 | |||
180 | return ret; | ||
171 | } | 181 | } |
172 | 182 | ||
173 | static enum led_brightness k90_record_led_get(struct led_classdev *led_cdev) | 183 | static enum led_brightness k90_record_led_get(struct led_classdev *led_cdev) |
@@ -253,7 +263,11 @@ static ssize_t k90_show_macro_mode(struct device *dev, | |||
253 | struct usb_interface *usbif = to_usb_interface(dev->parent); | 263 | struct usb_interface *usbif = to_usb_interface(dev->parent); |
254 | struct usb_device *usbdev = interface_to_usbdev(usbif); | 264 | struct usb_device *usbdev = interface_to_usbdev(usbif); |
255 | const char *macro_mode; | 265 | const char *macro_mode; |
256 | char data[8]; | 266 | char *data; |
267 | |||
268 | data = kmalloc(2, GFP_KERNEL); | ||
269 | if (!data) | ||
270 | return -ENOMEM; | ||
257 | 271 | ||
258 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), | 272 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), |
259 | K90_REQUEST_GET_MODE, | 273 | K90_REQUEST_GET_MODE, |
@@ -263,7 +277,8 @@ static ssize_t k90_show_macro_mode(struct device *dev, | |||
263 | if (ret < 0) { | 277 | if (ret < 0) { |
264 | 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", |
265 | ret); | 279 | ret); |
266 | return -EIO; | 280 | ret = -EIO; |
281 | goto out; | ||
267 | } | 282 | } |
268 | 283 | ||
269 | switch (data[0]) { | 284 | switch (data[0]) { |
@@ -277,10 +292,15 @@ static ssize_t k90_show_macro_mode(struct device *dev, | |||
277 | default: | 292 | default: |
278 | dev_warn(dev, "K90 in unknown mode: %02hhx.\n", | 293 | dev_warn(dev, "K90 in unknown mode: %02hhx.\n", |
279 | data[0]); | 294 | data[0]); |
280 | return -EIO; | 295 | ret = -EIO; |
296 | goto out; | ||
281 | } | 297 | } |
282 | 298 | ||
283 | return snprintf(buf, PAGE_SIZE, "%s\n", macro_mode); | 299 | ret = snprintf(buf, PAGE_SIZE, "%s\n", macro_mode); |
300 | out: | ||
301 | kfree(data); | ||
302 | |||
303 | return ret; | ||
284 | } | 304 | } |
285 | 305 | ||
286 | static ssize_t k90_store_macro_mode(struct device *dev, | 306 | static ssize_t k90_store_macro_mode(struct device *dev, |
@@ -320,7 +340,11 @@ static ssize_t k90_show_current_profile(struct device *dev, | |||
320 | struct usb_interface *usbif = to_usb_interface(dev->parent); | 340 | struct usb_interface *usbif = to_usb_interface(dev->parent); |
321 | struct usb_device *usbdev = interface_to_usbdev(usbif); | 341 | struct usb_device *usbdev = interface_to_usbdev(usbif); |
322 | int current_profile; | 342 | int current_profile; |
323 | char data[8]; | 343 | char *data; |
344 | |||
345 | data = kmalloc(8, GFP_KERNEL); | ||
346 | if (!data) | ||
347 | return -ENOMEM; | ||
324 | 348 | ||
325 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), | 349 | ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), |
326 | K90_REQUEST_STATUS, | 350 | K90_REQUEST_STATUS, |
@@ -330,16 +354,22 @@ static ssize_t k90_show_current_profile(struct device *dev, | |||
330 | if (ret < 0) { | 354 | if (ret < 0) { |
331 | 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", |
332 | ret); | 356 | ret); |
333 | return -EIO; | 357 | ret = -EIO; |
358 | goto out; | ||
334 | } | 359 | } |
335 | current_profile = data[7]; | 360 | current_profile = data[7]; |
336 | if (current_profile < 1 || current_profile > 3) { | 361 | if (current_profile < 1 || current_profile > 3) { |
337 | dev_warn(dev, "Read invalid current profile: %02hhx.\n", | 362 | dev_warn(dev, "Read invalid current profile: %02hhx.\n", |
338 | data[7]); | 363 | data[7]); |
339 | return -EIO; | 364 | ret = -EIO; |
365 | goto out; | ||
340 | } | 366 | } |
341 | 367 | ||
342 | return snprintf(buf, PAGE_SIZE, "%d\n", current_profile); | 368 | ret = snprintf(buf, PAGE_SIZE, "%d\n", current_profile); |
369 | out: | ||
370 | kfree(data); | ||
371 | |||
372 | return ret; | ||
343 | } | 373 | } |
344 | 374 | ||
345 | static ssize_t k90_store_current_profile(struct device *dev, | 375 | static ssize_t k90_store_current_profile(struct device *dev, |