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>
This commit is contained in:
committed by
Linus Torvalds
parent
0f66f96d21
commit
eef3a116be
@@ -386,6 +386,7 @@ void inotify_ignored_and_remove_idr(struct fsnotify_mark_entry *entry,
|
||||
struct fsnotify_event *ignored_event;
|
||||
struct inotify_event_private_data *event_priv;
|
||||
struct fsnotify_event_private_data *fsn_event_priv;
|
||||
int ret;
|
||||
|
||||
ignored_event = fsnotify_create_event(NULL, FS_IN_IGNORED, NULL,
|
||||
FSNOTIFY_EVENT_NONE, NULL, 0,
|
||||
@@ -404,10 +405,8 @@ void inotify_ignored_and_remove_idr(struct fsnotify_mark_entry *entry,
|
||||
fsn_event_priv->group = group;
|
||||
event_priv->wd = ientry->wd;
|
||||
|
||||
fsnotify_add_notify_event(group, ignored_event, fsn_event_priv);
|
||||
|
||||
/* did the private data get added? */
|
||||
if (list_empty(&fsn_event_priv->event_list))
|
||||
ret = fsnotify_add_notify_event(group, ignored_event, fsn_event_priv);
|
||||
if (ret)
|
||||
inotify_free_event_priv(fsn_event_priv);
|
||||
|
||||
skip_send_ignore:
|
||||
|
Reference in New Issue
Block a user