aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/hidraw.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
index 47d70c523d93..5a6f99b1db12 100644
--- a/drivers/hid/hidraw.c
+++ b/drivers/hid/hidraw.c
@@ -212,9 +212,13 @@ static int hidraw_release(struct inode * inode, struct file * file)
212 unsigned int minor = iminor(inode); 212 unsigned int minor = iminor(inode);
213 struct hidraw *dev; 213 struct hidraw *dev;
214 struct hidraw_list *list = file->private_data; 214 struct hidraw_list *list = file->private_data;
215 int ret;
215 216
216 if (!hidraw_table[minor]) 217 mutex_lock(&minors_lock);
217 return -ENODEV; 218 if (!hidraw_table[minor]) {
219 ret = -ENODEV;
220 goto unlock;
221 }
218 222
219 list_del(&list->node); 223 list_del(&list->node);
220 dev = hidraw_table[minor]; 224 dev = hidraw_table[minor];
@@ -227,10 +231,12 @@ static int hidraw_release(struct inode * inode, struct file * file)
227 kfree(list->hidraw); 231 kfree(list->hidraw);
228 } 232 }
229 } 233 }
230
231 kfree(list); 234 kfree(list);
235 ret = 0;
236unlock:
237 mutex_unlock(&minors_lock);
232 238
233 return 0; 239 return ret;
234} 240}
235 241
236static long hidraw_ioctl(struct file *file, unsigned int cmd, 242static long hidraw_ioctl(struct file *file, unsigned int cmd,