diff options
author | Dan Carpenter <error27@gmail.com> | 2009-02-03 08:35:17 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2009-02-17 07:25:01 -0500 |
commit | dfd395aff4cb16d2480b280064bea1b19ededef1 (patch) | |
tree | 54a64c67f6284fe431126741033fcf71bfbe809c | |
parent | 35cfd1d964f3c2420862f2167a0eb85ff1208999 (diff) |
HID: unlock properly on error paths in hidraw_ioctl()
We can't return immediately because lock_kernel() is held.
Signed-off-by: Dan Carpenter <error27@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r-- | drivers/hid/hidraw.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 732449628971..02b19db5442e 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
@@ -267,8 +267,10 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, | |||
267 | default: | 267 | default: |
268 | { | 268 | { |
269 | struct hid_device *hid = dev->hid; | 269 | struct hid_device *hid = dev->hid; |
270 | if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ) | 270 | if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ) { |
271 | return -EINVAL; | 271 | ret = -EINVAL; |
272 | break; | ||
273 | } | ||
272 | 274 | ||
273 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) { | 275 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) { |
274 | int len; | 276 | int len; |
@@ -277,8 +279,9 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, | |||
277 | len = strlen(hid->name) + 1; | 279 | len = strlen(hid->name) + 1; |
278 | if (len > _IOC_SIZE(cmd)) | 280 | if (len > _IOC_SIZE(cmd)) |
279 | len = _IOC_SIZE(cmd); | 281 | len = _IOC_SIZE(cmd); |
280 | return copy_to_user(user_arg, hid->name, len) ? | 282 | ret = copy_to_user(user_arg, hid->name, len) ? |
281 | -EFAULT : len; | 283 | -EFAULT : len; |
284 | break; | ||
282 | } | 285 | } |
283 | 286 | ||
284 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) { | 287 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) { |
@@ -288,12 +291,13 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, | |||
288 | len = strlen(hid->phys) + 1; | 291 | len = strlen(hid->phys) + 1; |
289 | if (len > _IOC_SIZE(cmd)) | 292 | if (len > _IOC_SIZE(cmd)) |
290 | len = _IOC_SIZE(cmd); | 293 | len = _IOC_SIZE(cmd); |
291 | return copy_to_user(user_arg, hid->phys, len) ? | 294 | ret = copy_to_user(user_arg, hid->phys, len) ? |
292 | -EFAULT : len; | 295 | -EFAULT : len; |
296 | break; | ||
293 | } | 297 | } |
294 | } | 298 | } |
295 | 299 | ||
296 | ret = -ENOTTY; | 300 | ret = -ENOTTY; |
297 | } | 301 | } |
298 | unlock_kernel(); | 302 | unlock_kernel(); |
299 | return ret; | 303 | return ret; |