From: Eric Paris <eparis@redhat.com>
To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Cc: agruen@suse.de, tvrtko.ursulin@sophos.com
Subject: [PATCH 13/20] fanotify: limit number of listeners per user
Date: Thu, 28 Oct 2010 17:32:50 -0400 [thread overview]
Message-ID: <20101028213249.24810.41480.stgit@paris.rdu.redhat.com> (raw)
In-Reply-To: <20101028213139.24810.34058.stgit@paris.rdu.redhat.com>
fanotify currently has no limit on the number of listeners a given user can
have open. This patch limits the total number of listeners per user to
128. This is the same as the inotify default limit.
Signed-off-by: Eric Paris <eparis@redhat.com>
---
fs/notify/fanotify/fanotify.c | 11 ++++++++++-
fs/notify/fanotify/fanotify_user.c | 11 +++++++++++
include/linux/fsnotify_backend.h | 1 +
include/linux/sched.h | 3 +++
4 files changed, 25 insertions(+), 1 deletions(-)
diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
index 85366c7..60c11c3 100644
--- a/fs/notify/fanotify/fanotify.c
+++ b/fs/notify/fanotify/fanotify.c
@@ -200,10 +200,19 @@ static bool fanotify_should_send_event(struct fsnotify_group *group,
return false;
}
+static void fanotify_free_group_priv(struct fsnotify_group *group)
+{
+ struct user_struct *user;
+
+ user = group->fanotify_data.user;
+ atomic_dec(&user->fanotify_listeners);
+ free_uid(user);
+}
+
const struct fsnotify_ops fanotify_fsnotify_ops = {
.handle_event = fanotify_handle_event,
.should_send_event = fanotify_should_send_event,
- .free_group_priv = NULL,
+ .free_group_priv = fanotify_free_group_priv,
.free_event_priv = NULL,
.freeing_mark = NULL,
};
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
index f921610..a7d9369 100644
--- a/fs/notify/fanotify/fanotify_user.c
+++ b/fs/notify/fanotify/fanotify_user.c
@@ -18,6 +18,7 @@
#define FANOTIFY_DEFAULT_MAX_EVENTS 16384
#define FANOTIFY_DEFAULT_MAX_MARKS 8192
+#define FANOTIFY_DEFAULT_MAX_LISTENERS 128
extern const struct fsnotify_ops fanotify_fsnotify_ops;
@@ -656,6 +657,7 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags)
{
struct fsnotify_group *group;
int f_flags, fd;
+ struct user_struct *user;
pr_debug("%s: flags=%d event_f_flags=%d\n",
__func__, flags, event_f_flags);
@@ -666,6 +668,12 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags)
if (flags & ~FAN_ALL_INIT_FLAGS)
return -EINVAL;
+ user = get_current_user();
+ if (atomic_read(&user->fanotify_listeners) > FANOTIFY_DEFAULT_MAX_LISTENERS) {
+ free_uid(user);
+ return -EMFILE;
+ }
+
f_flags = O_RDWR | FMODE_NONOTIFY;
if (flags & FAN_CLOEXEC)
f_flags |= O_CLOEXEC;
@@ -677,6 +685,9 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags)
if (IS_ERR(group))
return PTR_ERR(group);
+ group->fanotify_data.user = user;
+ atomic_inc(&user->fanotify_listeners);
+
group->fanotify_data.f_flags = event_f_flags;
#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
mutex_init(&group->fanotify_data.access_mutex);
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h
index 49ceed6..4366f45 100644
--- a/include/linux/fsnotify_backend.h
+++ b/include/linux/fsnotify_backend.h
@@ -170,6 +170,7 @@ struct fsnotify_group {
#endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */
int f_flags;
unsigned int max_marks;
+ struct user_struct *user;
} fanotify_data;
#endif /* CONFIG_FANOTIFY */
};
diff --git a/include/linux/sched.h b/include/linux/sched.h
index be7adb7..6f420ba 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -672,6 +672,9 @@ struct user_struct {
atomic_t inotify_watches; /* How many inotify watches does this user have? */
atomic_t inotify_devs; /* How many inotify devs does this user have opened? */
#endif
+#ifdef CONFIG_FANOTIFY
+ atomic_t fanotify_listeners;
+#endif
#ifdef CONFIG_EPOLL
atomic_t epoll_watches; /* The number of file descriptors currently watched */
#endif
next prev parent reply other threads:[~2010-10-28 21:32 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-28 21:31 [PATCH 01/20] fanotify: allow fanotify to be built Eric Paris
2010-10-28 21:31 ` [PATCH 02/20] fsnotify: implement ordering between notifiers Eric Paris
2010-10-28 21:31 ` [PATCH 03/20] fanotify: implement fanotify listener ordering Eric Paris
2010-10-29 15:01 ` John Stoffel
2010-10-28 21:31 ` [PATCH 04/20] fanotify: use __aligned_u64 in fanotify userspace metadata Eric Paris
2010-10-28 21:32 ` [PATCH 05/20] fsnotify: correctly handle return codes from listeners Eric Paris
2010-10-28 21:32 ` [PATCH 06/20] fsnotify: call fsnotify_parent in perm events Eric Paris
2010-10-28 21:32 ` [PATCH 07/20] fanotify: allow userspace to flush all marks Eric Paris
2010-10-28 21:32 ` [PATCH 08/20] fanotify: ignore fanotify ignore marks if open writers Eric Paris
2010-10-28 21:32 ` [PATCH 09/20] fsnotify: implement a default maximum queue depth Eric Paris
2010-10-28 21:32 ` [PATCH 10/20] fanotify: allow userspace to override max " Eric Paris
2010-11-01 17:09 ` Tvrtko Ursulin
2010-11-01 17:23 ` Eric Paris
2010-11-01 17:34 ` Tvrtko Ursulin
2010-10-28 21:32 ` [PATCH 11/20] fanotify: limit the number of marks in a single fanotify group Eric Paris
2010-10-28 21:32 ` [PATCH 12/20] fanotify: allow userspace to override max marks Eric Paris
2010-11-01 17:16 ` Tvrtko Ursulin
2010-10-28 21:32 ` Eric Paris [this message]
2010-10-28 21:32 ` [PATCH 14/20] fanotify: do not send events for irregular files Eric Paris
2010-10-28 21:33 ` [PATCH 15/20] fsnotify: rename FS_IN_ISDIR to FS_ISDIR Eric Paris
2010-10-28 21:33 ` [PATCH 16/20] fanotify: ignore events on directories unless specifically requested Eric Paris
2010-10-28 21:33 ` [PATCH 17/20] fanotify: do not recalculate the mask if the ignored mask changed Eric Paris
2010-10-28 21:33 ` [PATCH 18/20] fanotify: Fix FAN_CLOSE comments Eric Paris
2010-10-28 21:33 ` [PATCH 19/20] fs/notify/fanotify/fanotify_user.c: fix warnings Eric Paris
2010-10-28 21:33 ` [PATCH 20/20] fsnotify: remove alignment padding from fsnotify_mark on 64 bit builds Eric Paris
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=20101028213249.24810.41480.stgit@paris.rdu.redhat.com \
--to=eparis@redhat.com \
--cc=agruen@suse.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tvrtko.ursulin@sophos.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).