summaryrefslogtreecommitdiffstats
path: root/fs/notify/fanotify/fanotify_user.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2014-01-28 21:38:06 +0100
committerJan Kara <jack@suse.cz>2014-01-29 13:57:17 +0100
commit85816794240b9659e66e4d9b0df7c6e814e5f603 (patch)
treedd9a5103e62f15e74b2d7729e972d141845462aa /fs/notify/fanotify/fanotify_user.c
parent83c0e1b442b488571f4fef4a91c2fe52eed6c705 (diff)
downloadlinux-stable-85816794240b9659e66e4d9b0df7c6e814e5f603.tar.gz
linux-stable-85816794240b9659e66e4d9b0df7c6e814e5f603.tar.bz2
linux-stable-85816794240b9659e66e4d9b0df7c6e814e5f603.zip
fanotify: Fix use after free for permission events
Currently struct fanotify_event_info has been destroyed immediately after reporting its contents to userspace. However that is wrong for permission events because those need to stay around until userspace provides response which is filled back in fanotify_event_info. So change to code to free permission events only after we have got the response from userspace. Reported-and-tested-by: Jiri Kosina <jkosina@suse.cz> Reported-and-tested-by: Dave Jones <davej@fedoraproject.org> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/notify/fanotify/fanotify_user.c')
-rw-r--r--fs/notify/fanotify/fanotify_user.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
index 1fd66abe5740..b6175fa11bf8 100644
--- a/fs/notify/fanotify/fanotify_user.c
+++ b/fs/notify/fanotify/fanotify_user.c
@@ -319,7 +319,12 @@ static ssize_t fanotify_read(struct file *file, char __user *buf,
if (IS_ERR(kevent))
break;
ret = copy_event_to_user(group, kevent, buf);
- fsnotify_destroy_event(group, kevent);
+ /*
+ * Permission events get destroyed after we
+ * receive response
+ */
+ if (!(kevent->mask & FAN_ALL_PERM_EVENTS))
+ fsnotify_destroy_event(group, kevent);
if (ret < 0)
break;
buf += ret;