Received: by 10.192.165.148 with SMTP id m20csp2457282imm; Sun, 22 Apr 2018 07:26:39 -0700 (PDT) X-Google-Smtp-Source: AIpwx481wQHac3/Yx5BbC2fbVeQosLGPB0XNWOB8V2GUUB/VKhNestPbrLzzphz6M3ksU9fM7oQI X-Received: by 10.99.123.93 with SMTP id k29mr14329251pgn.249.1524407199208; Sun, 22 Apr 2018 07:26:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524407199; cv=none; d=google.com; s=arc-20160816; b=BI8znKznL+4SXNl8DrH79bYdV8wJ0hBXDDOXt9BVM09DUVIS9pRE/1JoKaCbpAcGiy bgZidTPjgIRWyTe/rycY2/uX1AZe8PftaRbQgi74JufDeQeJh6cucJreM9tOvfCrCLtp kR0/ob0lqpa8nSUvQIJ4IMpHc2H1wHDD2xYyztCy0Gp/PL+CXrVZI3gy2AiAm3/8fqP+ fO2w/uRdc50HggXF8LKrsx4nr3VGZOMFyRdMkuMyi9j3qtgvQGp9PANgJVAi9LVCEZes 9CP4SyusZAifqWZqc2vQFEtVoMgTg0v7sEkhAZvlynNlSCoEMW1h+ULHY+uZv1r4n4Gj /Q8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=GKLbf7CsfiNtXrXbXXo3u+4T+jlrdo4RQWiFxPWf7qw=; b=Bemsj36O/M0U7voRpFVrt3KV3UljTsR9actzj0skj05pvtwRV6JlTzhVVWQqDzXACQ E8zD3TnD4vbF3NHciJIsbBY6ouJMfgAAZmJIS3ArSe59GqmC0n2DO9Hm5kLIcvFY5MkL L/xCmpfdAvJpF26Igv2eT0IAk2G9HvrC/ByiBCIFC3zJdNJCQlZo1SSTDN/Kdju8B5Fr Y1IUydUsyIwZwuyrBuMUbyWLS34jhwAmiquaYprokIGkMZHnBcRHykp9N8276KxLkWg9 ldlJRh2MSfs6JUes53YxUM/bLqiDFi6/t7hulgHXi2u8jiSPkoLm6TEduy6aFYXVb4KD p4Og== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b2si8345252pgn.131.2018.04.22.07.26.24; Sun, 22 Apr 2018 07:26:39 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757893AbeDVOYm (ORCPT + 99 others); Sun, 22 Apr 2018 10:24:42 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:33214 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757642AbeDVOWC (ORCPT ); Sun, 22 Apr 2018 10:22:02 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 4B633D22; Sun, 22 Apr 2018 14:22:01 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Amir Goldstein , Jan Kara , Nathan Chancellor Subject: [PATCH 3.18 52/52] fanotify: fix logic of events on child Date: Sun, 22 Apr 2018 15:54:25 +0200 Message-Id: <20180422135317.721399577@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180422135315.254787616@linuxfoundation.org> References: <20180422135315.254787616@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.18-stable review patch. If anyone has any objections, please let me know. ------------------ From: Amir Goldstein commit 54a307ba8d3cd00a3902337ffaae28f436eeb1a4 upstream. When event on child inodes are sent to the parent inode mark and parent inode mark was not marked with FAN_EVENT_ON_CHILD, the event will not be delivered to the listener process. However, if the same process also has a mount mark, the event to the parent inode will be delivered regadless of the mount mark mask. This behavior is incorrect in the case where the mount mark mask does not contain the specific event type. For example, the process adds a mark on a directory with mask FAN_MODIFY (without FAN_EVENT_ON_CHILD) and a mount mark with mask FAN_CLOSE_NOWRITE (without FAN_ONDIR). A modify event on a file inside that directory (and inside that mount) should not create a FAN_MODIFY event, because neither of the marks requested to get that event on the file. Fixes: 1968f5eed54c ("fanotify: use both marks when possible") Cc: stable Signed-off-by: Amir Goldstein Signed-off-by: Jan Kara [natechancellor: Fix small conflict due to lack of 3cd5eca8d7a2f] Signed-off-by: Nathan Chancellor Signed-off-by: Greg Kroah-Hartman --- fs/notify/fanotify/fanotify.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -92,7 +92,7 @@ static bool fanotify_should_send_event(s u32 event_mask, void *data, int data_type) { - __u32 marks_mask, marks_ignored_mask; + __u32 marks_mask = 0, marks_ignored_mask = 0; struct path *path = data; pr_debug("%s: inode_mark=%p vfsmnt_mark=%p mask=%x data=%p" @@ -108,24 +108,20 @@ static bool fanotify_should_send_event(s !S_ISDIR(path->dentry->d_inode->i_mode)) return false; - if (inode_mark && vfsmnt_mark) { - marks_mask = (vfsmnt_mark->mask | inode_mark->mask); - marks_ignored_mask = (vfsmnt_mark->ignored_mask | inode_mark->ignored_mask); - } else if (inode_mark) { - /* - * if the event is for a child and this inode doesn't care about - * events on the child, don't send it! - */ - if ((event_mask & FS_EVENT_ON_CHILD) && - !(inode_mark->mask & FS_EVENT_ON_CHILD)) - return false; - marks_mask = inode_mark->mask; - marks_ignored_mask = inode_mark->ignored_mask; - } else if (vfsmnt_mark) { - marks_mask = vfsmnt_mark->mask; - marks_ignored_mask = vfsmnt_mark->ignored_mask; - } else { - BUG(); + /* + * if the event is for a child and this inode doesn't care about + * events on the child, don't send it! + */ + if (inode_mark && + (!(event_mask & FS_EVENT_ON_CHILD) || + (inode_mark->mask & FS_EVENT_ON_CHILD))) { + marks_mask |= inode_mark->mask; + marks_ignored_mask |= inode_mark->ignored_mask; + } + + if (vfsmnt_mark) { + marks_mask |= vfsmnt_mark->mask; + marks_ignored_mask |= vfsmnt_mark->ignored_mask; } if (S_ISDIR(path->dentry->d_inode->i_mode) &&