aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/evdev.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dtor@insightbb.com>2007-06-03 23:29:36 -0400
committerDmitry Torokhov <dtor@insightbb.com>2007-06-03 23:50:05 -0400
commit1dfa2812404c37d7571622195f907cea3331616c (patch)
tree2533af73ff0e1e4d24603967bd6cdc092973dce9 /drivers/input/evdev.c
parent26be5a509af5f80c7012bd4f0478a94746c9c9d9 (diff)
Input: reduce raciness when input handlers disconnect
There is a race between input handler's release() and disconnect() methods: when input handler disconnects it wakes up all regular users and then process to walk user list to wake up async. users. While disconnect() walks the list release() removes elements of the same list causing oopses. While this is not a substibute for proper locking we can reduce odds of getting an oops if we wake up normal readers after walking the list. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input/evdev.c')
-rw-r--r--drivers/input/evdev.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index a4c3729d3960..93b407cd4600 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -700,9 +700,9 @@ static void evdev_disconnect(struct input_handle *handle)
700 if (evdev->open) { 700 if (evdev->open) {
701 input_flush_device(handle, NULL); 701 input_flush_device(handle, NULL);
702 input_close_device(handle); 702 input_close_device(handle);
703 wake_up_interruptible(&evdev->wait);
704 list_for_each_entry(client, &evdev->client_list, node) 703 list_for_each_entry(client, &evdev->client_list, node)
705 kill_fasync(&client->fasync, SIGIO, POLL_HUP); 704 kill_fasync(&client->fasync, SIGIO, POLL_HUP);
705 wake_up_interruptible(&evdev->wait);
706 } else 706 } else
707 evdev_free(evdev); 707 evdev_free(evdev);
708} 708}