From: Miklos Szeredi <mszeredi@redhat.com>
To: linux-fsdevel@vger.kernel.org
Cc: Jan Kara <jack@suse.cz>, Amir Goldstein <amir73il@gmail.com>,
Xiong Zhou <xzhou@redhat.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH v2 5/7] fanotify: fix fsnotify_prepare_user_wait() failure
Date: Wed, 25 Oct 2017 10:41:37 +0200 [thread overview]
Message-ID: <1508920899-8115-6-git-send-email-mszeredi@redhat.com> (raw)
In-Reply-To: <1508920899-8115-1-git-send-email-mszeredi@redhat.com>
If fsnotify_prepare_user_wait() fails, we leave the event on the
notification list. Which will result in a warning in
fsnotify_destroy_event() and later use-after-free.
Instead of adding a new helper to remove the event from the list in this
case, I opted to move the prepare/finish up into fanotify_handle_event().
This will allow these to be moved further out into the generic code later,
and perhaps let us move to non-sleeping RCU.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Fixes: 05f0e38724e8 ("fanotify: Release SRCU lock when waiting for userspace response")
Cc: <stable@vger.kernel.org> # v4.12
---
fs/notify/fanotify/fanotify.c | 33 ++++++++++++++++++++-------------
1 file changed, 20 insertions(+), 13 deletions(-)
diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
index 2fa99aeaa095..df3f484e458a 100644
--- a/fs/notify/fanotify/fanotify.c
+++ b/fs/notify/fanotify/fanotify.c
@@ -64,19 +64,8 @@ static int fanotify_get_response(struct fsnotify_group *group,
pr_debug("%s: group=%p event=%p\n", __func__, group, event);
- /*
- * fsnotify_prepare_user_wait() fails if we race with mark deletion.
- * Just let the operation pass in that case.
- */
- if (!fsnotify_prepare_user_wait(iter_info)) {
- event->response = FAN_ALLOW;
- goto out;
- }
-
wait_event(group->fanotify_data.access_waitq, event->response);
- fsnotify_finish_user_wait(iter_info);
-out:
/* userspace responded, convert to something usable */
switch (event->response) {
case FAN_ALLOW:
@@ -211,9 +200,21 @@ static int fanotify_handle_event(struct fsnotify_group *group,
pr_debug("%s: group=%p inode=%p mask=%x\n", __func__, group, inode,
mask);
+#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
+ if (mask & FAN_ALL_PERM_EVENTS) {
+ /*
+ * fsnotify_prepare_user_wait() fails if we race with mark
+ * deletion. Just let the operation pass in that case.
+ */
+ if (!fsnotify_prepare_user_wait(iter_info))
+ return 0;
+ }
+#endif
+
event = fanotify_alloc_event(inode, mask, data);
+ ret = -ENOMEM;
if (unlikely(!event))
- return -ENOMEM;
+ goto finish;
fsn_event = &event->fse;
ret = fsnotify_add_event(group, fsn_event, fanotify_merge);
@@ -223,7 +224,8 @@ static int fanotify_handle_event(struct fsnotify_group *group,
/* Our event wasn't used in the end. Free it. */
fsnotify_destroy_event(group, fsn_event);
- return 0;
+ ret = 0;
+ goto finish;
}
#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
@@ -232,6 +234,11 @@ static int fanotify_handle_event(struct fsnotify_group *group,
iter_info);
fsnotify_destroy_event(group, fsn_event);
}
+finish:
+ if (mask & FAN_ALL_PERM_EVENTS)
+ fsnotify_finish_user_wait(iter_info);
+#else
+finish:
#endif
return ret;
}
--
2.5.5
next prev parent reply other threads:[~2017-10-25 8:41 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-25 8:41 [PATCH v2 0/7] fix fanotify issues with the series in v4.12 Miklos Szeredi
2017-10-25 8:41 ` [PATCH v2 1/7] fsnotify: clean up fsnotify_prepare/finish_user_wait() Miklos Szeredi
2017-10-25 12:06 ` Amir Goldstein
2017-10-25 12:07 ` Amir Goldstein
2017-10-25 14:15 ` Miklos Szeredi
2017-10-25 8:41 ` [PATCH v2 2/7] fsnotify: pin both inode and vfsmount mark Miklos Szeredi
2017-10-30 13:34 ` Jan Kara
2017-10-30 13:42 ` Miklos Szeredi
2017-10-30 14:05 ` Jan Kara
2017-10-25 8:41 ` [PATCH v2 3/7] fsnotify: fix pinning group in fsnotify_prepare_user_wait() Miklos Szeredi
2017-10-25 8:41 ` [PATCH v2 4/7] fsnotify: skip unattached marks Miklos Szeredi
2017-10-30 14:00 ` Jan Kara
2017-10-30 14:27 ` Miklos Szeredi
2017-10-25 8:41 ` Miklos Szeredi [this message]
2017-10-25 8:41 ` [PATCH v2 6/7] fsnotify: clean up fsnotify() Miklos Szeredi
2017-10-25 11:46 ` Amir Goldstein
2017-10-25 8:41 ` [PATCH v2 7/7] fanotify: clean up CONFIG_FANOTIFY_ACCESS_PERMISSIONS ifdefs Miklos Szeredi
2017-10-25 11:44 ` Amir Goldstein
2017-10-25 14:19 ` Miklos Szeredi
2017-10-30 17:20 ` Jan Kara
2017-10-25 14:31 ` [PATCH v2 0/7] fix fanotify issues with the series in v4.12 Miklos Szeredi
2017-10-25 15:13 ` Amir Goldstein
2017-10-27 11:53 ` Jan Kara
2017-10-30 15:56 ` Miklos Szeredi
2017-10-30 17:27 ` Jan Kara
2017-10-30 20:18 ` Miklos Szeredi
2017-10-31 9:54 ` Jan Kara
2017-10-31 11:02 ` Amir Goldstein
2017-10-31 16:27 ` Jan Kara
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1508920899-8115-6-git-send-email-mszeredi@redhat.com \
--to=mszeredi@redhat.com \
--cc=amir73il@gmail.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=xzhou@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).