diff options
Diffstat (limited to 'fs/notify/fanotify/fanotify_user.c')
-rw-r--r-- | fs/notify/fanotify/fanotify_user.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index f9216102b426..a7d9369482d5 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | #define FANOTIFY_DEFAULT_MAX_EVENTS 16384 | 19 | #define FANOTIFY_DEFAULT_MAX_EVENTS 16384 |
20 | #define FANOTIFY_DEFAULT_MAX_MARKS 8192 | 20 | #define FANOTIFY_DEFAULT_MAX_MARKS 8192 |
21 | #define FANOTIFY_DEFAULT_MAX_LISTENERS 128 | ||
21 | 22 | ||
22 | extern const struct fsnotify_ops fanotify_fsnotify_ops; | 23 | extern const struct fsnotify_ops fanotify_fsnotify_ops; |
23 | 24 | ||
@@ -656,6 +657,7 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) | |||
656 | { | 657 | { |
657 | struct fsnotify_group *group; | 658 | struct fsnotify_group *group; |
658 | int f_flags, fd; | 659 | int f_flags, fd; |
660 | struct user_struct *user; | ||
659 | 661 | ||
660 | pr_debug("%s: flags=%d event_f_flags=%d\n", | 662 | pr_debug("%s: flags=%d event_f_flags=%d\n", |
661 | __func__, flags, event_f_flags); | 663 | __func__, flags, event_f_flags); |
@@ -666,6 +668,12 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) | |||
666 | if (flags & ~FAN_ALL_INIT_FLAGS) | 668 | if (flags & ~FAN_ALL_INIT_FLAGS) |
667 | return -EINVAL; | 669 | return -EINVAL; |
668 | 670 | ||
671 | user = get_current_user(); | ||
672 | if (atomic_read(&user->fanotify_listeners) > FANOTIFY_DEFAULT_MAX_LISTENERS) { | ||
673 | free_uid(user); | ||
674 | return -EMFILE; | ||
675 | } | ||
676 | |||
669 | f_flags = O_RDWR | FMODE_NONOTIFY; | 677 | f_flags = O_RDWR | FMODE_NONOTIFY; |
670 | if (flags & FAN_CLOEXEC) | 678 | if (flags & FAN_CLOEXEC) |
671 | f_flags |= O_CLOEXEC; | 679 | f_flags |= O_CLOEXEC; |
@@ -677,6 +685,9 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) | |||
677 | if (IS_ERR(group)) | 685 | if (IS_ERR(group)) |
678 | return PTR_ERR(group); | 686 | return PTR_ERR(group); |
679 | 687 | ||
688 | group->fanotify_data.user = user; | ||
689 | atomic_inc(&user->fanotify_listeners); | ||
690 | |||
680 | group->fanotify_data.f_flags = event_f_flags; | 691 | group->fanotify_data.f_flags = event_f_flags; |
681 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS | 692 | #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS |
682 | mutex_init(&group->fanotify_data.access_mutex); | 693 | mutex_init(&group->fanotify_data.access_mutex); |