aboutsummaryrefslogtreecommitdiffstats
path: root/fs/notify/notification.c
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2009-08-16 21:51:44 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-08-17 16:37:37 -0400
commiteef3a116be11d35396efb2a8cc7345fd3221e294 (patch)
tree2a5d0b36dd5985f29eac43f51b03e610e40b7c9b /fs/notify/notification.c
parent0f66f96d21b4bbff49baaa337546e687d7c58e87 (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.c7
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/*