diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/notify/fanotify/fanotify_user.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index bbcb98e7fcc6..1c09e6321c5e 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c | |||
@@ -664,6 +664,20 @@ SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) | |||
664 | init_waitqueue_head(&group->fanotify_data.access_waitq); | 664 | init_waitqueue_head(&group->fanotify_data.access_waitq); |
665 | INIT_LIST_HEAD(&group->fanotify_data.access_list); | 665 | INIT_LIST_HEAD(&group->fanotify_data.access_list); |
666 | #endif | 666 | #endif |
667 | switch (flags & FAN_ALL_CLASS_BITS) { | ||
668 | case FAN_CLASS_NOTIF: | ||
669 | group->priority = FS_PRIO_0; | ||
670 | break; | ||
671 | case FAN_CLASS_CONTENT: | ||
672 | group->priority = FS_PRIO_1; | ||
673 | break; | ||
674 | case FAN_CLASS_PRE_CONTENT: | ||
675 | group->priority = FS_PRIO_2; | ||
676 | break; | ||
677 | default: | ||
678 | fd = -EINVAL; | ||
679 | goto out_put_group; | ||
680 | } | ||
667 | 681 | ||
668 | fd = anon_inode_getfd("[fanotify]", &fanotify_fops, group, f_flags); | 682 | fd = anon_inode_getfd("[fanotify]", &fanotify_fops, group, f_flags); |
669 | if (fd < 0) | 683 | if (fd < 0) |
@@ -719,6 +733,16 @@ SYSCALL_DEFINE(fanotify_mark)(int fanotify_fd, unsigned int flags, | |||
719 | ret = -EINVAL; | 733 | ret = -EINVAL; |
720 | if (unlikely(filp->f_op != &fanotify_fops)) | 734 | if (unlikely(filp->f_op != &fanotify_fops)) |
721 | goto fput_and_out; | 735 | goto fput_and_out; |
736 | group = filp->private_data; | ||
737 | |||
738 | /* | ||
739 | * group->priority == FS_PRIO_0 == FAN_CLASS_NOTIF. These are not | ||
740 | * allowed to set permissions events. | ||
741 | */ | ||
742 | ret = -EINVAL; | ||
743 | if (mask & FAN_ALL_PERM_EVENTS && | ||
744 | group->priority == FS_PRIO_0) | ||
745 | goto fput_and_out; | ||
722 | 746 | ||
723 | ret = fanotify_find_path(dfd, pathname, &path, flags); | 747 | ret = fanotify_find_path(dfd, pathname, &path, flags); |
724 | if (ret) | 748 | if (ret) |
@@ -729,7 +753,6 @@ SYSCALL_DEFINE(fanotify_mark)(int fanotify_fd, unsigned int flags, | |||
729 | inode = path.dentry->d_inode; | 753 | inode = path.dentry->d_inode; |
730 | else | 754 | else |
731 | mnt = path.mnt; | 755 | mnt = path.mnt; |
732 | group = filp->private_data; | ||
733 | 756 | ||
734 | /* create/update an inode mark */ | 757 | /* create/update an inode mark */ |
735 | switch (flags & (FAN_MARK_ADD | FAN_MARK_REMOVE | FAN_MARK_FLUSH)) { | 758 | switch (flags & (FAN_MARK_ADD | FAN_MARK_REMOVE | FAN_MARK_FLUSH)) { |