Commit b0e14951 authored by Jiri Kosina's avatar Jiri Kosina

HID: fix possible deadlock in hidraw_read

If the loop in hidraw_read() loops more than once, then we might
end up trying to acquire already locked mutex, casuing a deadlock.
Reported-by: default avatariceberg <iceberg@ispras.ru>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent ff9b00a2
...@@ -47,10 +47,9 @@ static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, ...@@ -47,10 +47,9 @@ static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count,
char *report; char *report;
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
while (ret == 0) { mutex_lock(&list->read_mutex);
mutex_lock(&list->read_mutex);
while (ret == 0) {
if (list->head == list->tail) { if (list->head == list->tail) {
add_wait_queue(&list->hidraw->wait, &wait); add_wait_queue(&list->hidraw->wait, &wait);
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment