lkml.org 
[lkml]   [2020]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.6 047/606] fanotify: fix merging marks masks with FAN_ONDIR
    Date
    From: Amir Goldstein <amir73il@gmail.com>

    commit 55bf882c7f13dda8bbe624040c6d5b4fbb812d16 upstream.

    Change the logic of FAN_ONDIR in two ways that are similar to the logic
    of FAN_EVENT_ON_CHILD, that was fixed in commit 54a307ba8d3c ("fanotify:
    fix logic of events on child"):

    1. The flag is meaningless in ignore mask
    2. The flag refers only to events in the mask of the mark where it is set

    This is what the fanotify_mark.2 man page says about FAN_ONDIR:
    "Without this flag, only events for files are created." It doesn't
    say anything about setting this flag in ignore mask to stop getting
    events on directories nor can I think of any setup where this capability
    would be useful.

    Currently, when marks masks are merged, the FAN_ONDIR flag set in one
    mark affects the events that are set in another mark's mask and this
    behavior causes unexpected results. For example, a user adds a mark on a
    directory with mask FAN_ATTRIB | FAN_ONDIR and a mount mark with mask
    FAN_OPEN (without FAN_ONDIR). An opendir() of that directory (which is
    inside that mount) generates a FAN_OPEN event even though neither of the
    marks requested to get open events on directories.

    Link: https://lore.kernel.org/r/20200319151022.31456-10-amir73il@gmail.com
    Signed-off-by: Amir Goldstein <amir73il@gmail.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Cc: Rachel Sibley <rasibley@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/notify/fanotify/fanotify.c | 11 +++++++----
    1 file changed, 7 insertions(+), 4 deletions(-)

    diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
    index f5d30573f4a9..deb13f0a0f7d 100644
    --- a/fs/notify/fanotify/fanotify.c
    +++ b/fs/notify/fanotify/fanotify.c
    @@ -171,6 +171,13 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group,
    if (!fsnotify_iter_should_report_type(iter_info, type))
    continue;
    mark = iter_info->marks[type];
    + /*
    + * If the event is on dir and this mark doesn't care about
    + * events on dir, don't send it!
    + */
    + if (event_mask & FS_ISDIR && !(mark->mask & FS_ISDIR))
    + continue;
    +
    /*
    * If the event is for a child and this mark doesn't care about
    * events on a child, don't send it!
    @@ -203,10 +210,6 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group,
    user_mask &= ~FAN_ONDIR;
    }

    - if (event_mask & FS_ISDIR &&
    - !(marks_mask & FS_ISDIR & ~marks_ignored_mask))
    - return 0;
    -
    return test_mask & user_mask;
    }

    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-09 02:40    [W:2.042 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site