diff options
author | Eric Paris <eparis@redhat.com> | 2009-08-16 21:51:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-08-17 16:37:37 -0400 |
commit | eef3a116be11d35396efb2a8cc7345fd3221e294 (patch) | |
tree | 2a5d0b36dd5985f29eac43f51b03e610e40b7c9b /fs/notify/notification.c | |
parent | 0f66f96d21b4bbff49baaa337546e687d7c58e87 (diff) |
notify: unused event private race
inotify decides if private data it passed to get added to an event was
used by checking list_empty(). But it's possible that the event may
have been dequeued and the private event removed so it would look empty.
The fix is to use the return code from fsnotify_add_notify_event rather
than looking at the list.
Signed-off-by: Eric Paris <eparis@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/notify/notification.c')
-rw-r--r-- | fs/notify/notification.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/fs/notify/notification.c b/fs/notify/notification.c index 521368574e97..74b3cf30bc6b 100644 --- a/fs/notify/notification.c +++ b/fs/notify/notification.c | |||
@@ -171,9 +171,7 @@ int fsnotify_add_notify_event(struct fsnotify_group *group, struct fsnotify_even | |||
171 | struct list_head *list = &group->notification_list; | 171 | struct list_head *list = &group->notification_list; |
172 | struct fsnotify_event_holder *last_holder; | 172 | struct fsnotify_event_holder *last_holder; |
173 | struct fsnotify_event *last_event; | 173 | struct fsnotify_event *last_event; |
174 | 174 | int ret = 0; | |
175 | /* easy to tell if priv was attached to the event */ | ||
176 | INIT_LIST_HEAD(&priv->event_list); | ||
177 | 175 | ||
178 | /* | 176 | /* |
179 | * There is one fsnotify_event_holder embedded inside each fsnotify_event. | 177 | * There is one fsnotify_event_holder embedded inside each fsnotify_event. |
@@ -194,6 +192,7 @@ alloc_holder: | |||
194 | 192 | ||
195 | if (group->q_len >= group->max_events) { | 193 | if (group->q_len >= group->max_events) { |
196 | event = &q_overflow_event; | 194 | event = &q_overflow_event; |
195 | ret = -EOVERFLOW; | ||
197 | /* sorry, no private data on the overflow event */ | 196 | /* sorry, no private data on the overflow event */ |
198 | priv = NULL; | 197 | priv = NULL; |
199 | } | 198 | } |
@@ -235,7 +234,7 @@ alloc_holder: | |||
235 | mutex_unlock(&group->notification_mutex); | 234 | mutex_unlock(&group->notification_mutex); |
236 | 235 | ||
237 | wake_up(&group->notification_waitq); | 236 | wake_up(&group->notification_waitq); |
238 | return 0; | 237 | return ret; |
239 | } | 238 | } |
240 | 239 | ||
241 | /* | 240 | /* |