Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp3663720ima; Mon, 4 Feb 2019 03:04:18 -0800 (PST) X-Google-Smtp-Source: ALg8bN6INUpIFiISSlwro3alrQmvlnlzEyrvRBwlfabJhwVhkxD/iiiN/dX1GC7ZjdrOCIFnqk3k X-Received: by 2002:a17:902:930b:: with SMTP id bc11mr52220059plb.17.1549278258590; Mon, 04 Feb 2019 03:04:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549278258; cv=none; d=google.com; s=arc-20160816; b=l+1givtClTEGlCA71Ai8WpYdhYurMoLX1mznY9j+9IPteQXNQA4i2ST1LixzzNoH9i IX1SrGKEMjRXpsMjj3i9GAHl8vI3eNZoYWttAyBhLbz5MYCcOOyhRdtoO2KbUPsgAggq Px69Qjjz46PrpoJwVqGVGx0LbP9TbVb4JNuIQ6Xiz1v/j9Ypid51Ev7zyLlloJMOppbk 9rvohPXDTB6ERvrfT4sIJAhHd99qBKL8Rceg17vJmPqjcJUBqL25p8e+8RZ91UtmuRjR /IAj6op/ArT4NpEKJjwyEB99ecQ3orRl3lltHzi7i+STzPoSieSIs3pm6JoHqWvSqmVp voUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Usdce5z/oMtf7rVYcXM0B2itRWfKTcOpipXytYkb0g4=; b=VFrCvzdgk0/FEstcPN1re7p6iaGIyxkvKFqnM4aFw49F3lzpUVCO6MAK5SwQ7zT6v+ OO03EodW9PHZrZVrzSSMiSlIJCeIyK/c/5TTQa90Us32Ieq10GMF1YjubiHduTCQDvXN I563utEnfFUS37eppFLNU8v8GH8hWscwtOzbfGmrLgNFedEKzzzFn2DG3oQfnu7YDym6 aknLni8TDx5CjHejnpK1whJKs75FP8iTRjN3jEVbG1/6xachLWFvtbykljvd3njni3lr t/5ZaG9KC2Vo7MnE/4SIxLtSQis93ClJmALltCsY7iAjNGfIDgwiCSvcg+XOaSU/NOWj 1AFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=S6Q3P+b1; 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 w67si10563705pgw.84.2019.02.04.03.04.01; Mon, 04 Feb 2019 03:04:18 -0800 (PST) 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; dkim=pass header.i=@kernel.org header.s=default header.b=S6Q3P+b1; 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 S1731456AbfBDKqj (ORCPT + 99 others); Mon, 4 Feb 2019 05:46:39 -0500 Received: from mail.kernel.org ([198.145.29.99]:44888 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730996AbfBDKqh (ORCPT ); Mon, 4 Feb 2019 05:46:37 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 304FC217F9; Mon, 4 Feb 2019 10:46:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1549277196; bh=nd4ZWXPbclofJEdgWRDnS8a4VKwrqDw2zD0LhpdrywE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S6Q3P+b1p85B/1T8ArqVlDSRXePGZD0QotXTrb4p3xQsF8ujPB9yGZqMxORMwAmTp z381kYIEKqVAIEytXAglWjHCByKFEiF7q+UMfaudgIWyG4I24pOtYqCw9jTs6WWwRA bSMhWjdgjl2odQjP0Rp+7kd/Lm6lm8d63ec82KV4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Amir Goldstein , Jan Kara Subject: [PATCH 4.14 46/46] fanotify: fix handling of events on child sub-directory Date: Mon, 4 Feb 2019 11:37:17 +0100 Message-Id: <20190204103616.791566363@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190204103608.651205056@linuxfoundation.org> References: <20190204103608.651205056@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Amir Goldstein commit b469e7e47c8a075cc08bcd1e85d4365134bdcdd5 upstream. 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: # v4.19 Signed-off-by: Amir Goldstein Signed-off-by: Jan Kara [amir: backport to v4.9] Signed-off-by: Amir Goldstein Signed-off-by: Greg Kroah-Hartman --- fs/notify/fsnotify.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c @@ -158,9 +158,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 & ~FS_EVENT_ON_CHILD) { struct name_snapshot name; /* we are notifying a parent so come up with the new mask which @@ -264,6 +264,10 @@ int fsnotify(struct inode *to_tell, __u3 else mnt = NULL; + /* An event "on child" is not intended for a mount mark */ + if (mask & FS_EVENT_ON_CHILD) + mnt = NULL; + /* * Optimization: srcu_read_lock() has a memory barrier which can * be expensive. It protects walking the *_fsnotify_marks lists.