summaryrefslogtreecommitdiff |
diff options
author | Jan Kara <jack@suse.cz> | 2019-01-16 18:11:55 +0100 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2019-01-17 09:30:56 +0100 |
commit | 3895cc7502672a941291d2a3aac46034a15df7cc (patch) | |
tree | ee383e0c6f5e5093b0b325d623b752b9a88d7b7b | |
parent | 571e1317802232ba25e658c34b70165211a07034 (diff) |
fanotify: fix handling of events on child sub-directory
(bsc#1122019).
-rw-r--r-- | patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch | 89 | ||||
-rw-r--r-- | series.conf | 1 |
2 files changed, 90 insertions, 0 deletions
diff --git a/patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch b/patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch new file mode 100644 index 0000000000..8e301f2acf --- /dev/null +++ b/patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch @@ -0,0 +1,89 @@ +From b469e7e47c8a075cc08bcd1e85d4365134bdcdd5 Mon Sep 17 00:00:00 2001 +From: Amir Goldstein <amir73il@gmail.com> +Date: Tue, 30 Oct 2018 20:29:53 +0200 +Subject: [PATCH] fanotify: fix handling of events on child sub-directory +Git-commit: b469e7e47c8a075cc08bcd1e85d4365134bdcdd5 +Patch-mainline: v4.20-rc3 +References: bsc#1122019 + +When an event is reported on a sub-directory and the parent inode has +a mark mask with FS_EVENT_ON_CHILD|FS_ISDIR, the event will be sent to +fsnotify() even if the event type is not in the parent mark mask +(e.g. FS_OPEN). + +Further more, if that event happened on a mount or a filesystem with +a mount/sb mark that does have that event type in their mask, the "on +child" event will be reported on the mount/sb mark. That is not +desired, because user will get a duplicate event for the same action. + +Note that the event reported on the victim inode is never merged with +the event reported on the parent inode, because of the check in +Should_merge(): old_fsn->inode == new_fsn->inode. + +Fix this by looking for a match of an actual event type (i.e. not just +FS_ISDIR) in parent's inode mark mask and by not reporting an "on child" +event to group if event type is only found on mount/sb marks. + +[backport hint: The bug seems to have always been in fanotify, but this + patch will only apply cleanly to v4.19.y] + +Cc: <stable@vger.kernel.org> # v4.19 +Signed-off-by: Amir Goldstein <amir73il@gmail.com> +Signed-off-by: Jan Kara <jack@suse.cz> +Acked-by: Jan Kara <jack@suse.cz> + +--- + fs/notify/fanotify/fanotify.c | 10 +++++++--- + fs/notify/fsnotify.c | 7 ++++--- + 2 files changed, 11 insertions(+), 6 deletions(-) + +--- a/fs/notify/fanotify/fanotify.c ++++ b/fs/notify/fanotify/fanotify.c +@@ -106,8 +106,8 @@ static bool fanotify_should_send_event(s + return false; + + /* +- * if the event is for a child and this inode doesn't care about +- * events on the child, don't send it! ++ * If the event is for a child and this mark doesn't care about ++ * events on a child, don't send it! + */ + if (inode_mark && + (!(event_mask & FS_EVENT_ON_CHILD) || +@@ -116,7 +116,11 @@ static bool fanotify_should_send_event(s + marks_ignored_mask |= inode_mark->ignored_mask; + } + +- if (vfsmnt_mark) { ++ /* ++ * Mount marks don't care about event on children. Ignore them as ++ * otherwise we could report some events twice. ++ */ ++ if (vfsmnt_mark && !(event_mask & FS_EVENT_ON_CHILD)) { + marks_mask |= vfsmnt_mark->mask; + marks_ignored_mask |= vfsmnt_mark->ignored_mask; + } +--- a/fs/notify/fsnotify.c ++++ b/fs/notify/fsnotify.c +@@ -163,9 +163,9 @@ int __fsnotify_parent(const struct path + parent = dget_parent(dentry); + p_inode = parent->d_inode; + +- if (unlikely(!fsnotify_inode_watches_children(p_inode))) ++ if (unlikely(!fsnotify_inode_watches_children(p_inode))) { + __fsnotify_update_child_dentry_flags(p_inode); +- else if (p_inode->i_fsnotify_mask & mask) { ++ } else if (p_inode->i_fsnotify_mask & mask & ALL_FSNOTIFY_EVENTS) { + struct name_snapshot name; + + /* we are notifying a parent so come up with the new mask which +@@ -300,7 +300,8 @@ int fsnotify(struct inode *to_tell, __u3 + inode_node = srcu_dereference(inode_conn->list.first, + &fsnotify_mark_srcu); + +- if (mnt) { ++ /* An event "on child" is not intended for a mount mark */ ++ if (mnt && !(mask & FS_EVENT_ON_CHILD)) { + inode_conn = srcu_dereference(to_tell->i_fsnotify_marks, + &fsnotify_mark_srcu); + if (inode_conn) diff --git a/series.conf b/series.conf index 925d5fb850..34b8189236 100644 --- a/series.conf +++ b/series.conf @@ -19311,6 +19311,7 @@ patches.fixes/crypto-simd-correctly-take-reqsize-of-wrapped-skciph.patch patches.fixes/crypto-user-fix-leaking-uninitialized-memory-to-user.patch patches.fixes/gfs2-Put-bitmap-buffers-in-put_super.patch + patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch patches.fixes/ocfs2-free-up-write-context-when-direct-IO-failed.patch patches.suse/mm-vmstat.c-fix-NUMA-statistics-updates.patch patches.fixes/lib-ubsan.c-don-t-mark-__ubsan_handle_builtin_unreac.patch |