Received: by 2002:a4a:311b:0:0:0:0:0 with SMTP id k27-v6csp4800290ooa; Tue, 14 Aug 2018 10:43:37 -0700 (PDT) X-Google-Smtp-Source: AA+uWPyVdu4FVoaBwR8L1H4bsSguiWPp6EzaE8dZa8Qmw46oUoN1YxqTr/dYCmbjaRFOFi7xIwCw X-Received: by 2002:a17:902:7c89:: with SMTP id y9-v6mr21287312pll.187.1534268617789; Tue, 14 Aug 2018 10:43:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534268617; cv=none; d=google.com; s=arc-20160816; b=p29CvNrFHUM8MJZq+isOhKxDyYmsmZnNTEQ/EzpMvLR1NBvr23fvo3Vm0VVJVaBcR2 PJ9vkL3hOaQw4XzIO/e5J5i0beHSHmBOV352L9Ry6YOFN5ptN4HEnfcEprikqHlCZy+L 75WuuPhKJqdcGYdWtxPeWFAcZHs+lDJ0xDMbIJFwLVBA61x6UJaH3x/vFBPfwdca3Zhz oUvuLOjkypX3jY5RN5pIjTurZCF2hQo/ENWlbenKqlSgsZEPTx+A/yNCbaSPNbr5J3BA XkcpLsBImIfqTAzxSr1aJFkpyJqxz/lw7C7uB6kkepKTwJA7QW6EGgpsTwkYinC+KGFl 0ZpQ== 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=QAki0bF8I0KVcloyY868KXws5AJyVj5d9httr4jA/rE=; b=hJcBPRyKX06mdUpJDzYNxF7HBQH4S2F35bNnJMHO/ZN/0XWwiQCoVqUeMYtMFzeXy2 UBsZqcMwpRdyAuizSL1s96h8tEkLWq0bc7aCpLQnzx5ESkqOLHjfDnS4Y9NdwyGckO+N RiE/4eh2v+Kfu1Li/t5KF9O3sTar+qAHBeNFuxzvOFUCZeJiXKI1qn25QRwoNM0sUp/7 aKDjsyNSBKp1cRM3+S2Tx+ktbCaou86hCLsf4SGHdcegeDmJcuTCCkA/B4w/jcHx3mLp ZwjkesDM4TWihL9s4E8usvQtvP4CGfGKVbrTFjAMRvY3vf6bq5xz6EYCDxVCgM2+D1F+ CxYw== 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 g12-v6si16198084pla.403.2018.08.14.10.43.22; Tue, 14 Aug 2018 10:43:37 -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 S2390020AbeHNUaB (ORCPT + 99 others); Tue, 14 Aug 2018 16:30:01 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:59072 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730139AbeHNUaB (ORCPT ); Tue, 14 Aug 2018 16:30:01 -0400 Received: from localhost (unknown [194.244.16.108]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 43289D7D; Tue, 14 Aug 2018 17:41:50 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Oleg Nesterov , Al Viro Subject: [PATCH 4.9 014/107] fix __legitimize_mnt()/mntput() race Date: Tue, 14 Aug 2018 19:16:37 +0200 Message-Id: <20180814171521.642290088@linuxfoundation.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180814171520.883143803@linuxfoundation.org> References: <20180814171520.883143803@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 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Al Viro commit 119e1ef80ecfe0d1deb6378d4ab41f5b71519de1 upstream. __legitimize_mnt() has two problems - one is that in case of success the check of mount_lock is not ordered wrt preceding increment of refcount, making it possible to have successful __legitimize_mnt() on one CPU just before the otherwise final mntpu() on another, with __legitimize_mnt() not seeing mntput() taking the lock and mntput() not seeing the increment done by __legitimize_mnt(). Solved by a pair of barriers. Another is that failure of __legitimize_mnt() on the second read_seqretry() leaves us with reference that'll need to be dropped by caller; however, if that races with final mntput() we can end up with caller dropping rcu_read_lock() and doing mntput() to release that reference - with the first mntput() having freed the damn thing just as rcu_read_lock() had been dropped. Solution: in "do mntput() yourself" failure case grab mount_lock, check if MNT_DOOMED has been set by racing final mntput() that has missed our increment and if it has - undo the increment and treat that as "failure, caller doesn't need to drop anything" case. It's not easy to hit - the final mntput() has to come right after the first read_seqretry() in __legitimize_mnt() *and* manage to miss the increment done by __legitimize_mnt() before the second read_seqretry() in there. The things that are almost impossible to hit on bare hardware are not impossible on SMP KVM, though... Reported-by: Oleg Nesterov Fixes: 48a066e72d97 ("RCU'd vsfmounts") Cc: stable@vger.kernel.org Signed-off-by: Al Viro Signed-off-by: Greg Kroah-Hartman --- fs/namespace.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) --- a/fs/namespace.c +++ b/fs/namespace.c @@ -603,12 +603,21 @@ int __legitimize_mnt(struct vfsmount *ba return 0; mnt = real_mount(bastard); mnt_add_count(mnt, 1); + smp_mb(); // see mntput_no_expire() if (likely(!read_seqretry(&mount_lock, seq))) return 0; if (bastard->mnt_flags & MNT_SYNC_UMOUNT) { mnt_add_count(mnt, -1); return 1; } + lock_mount_hash(); + if (unlikely(bastard->mnt_flags & MNT_DOOMED)) { + mnt_add_count(mnt, -1); + unlock_mount_hash(); + return 1; + } + unlock_mount_hash(); + /* caller will mntput() */ return -1; } @@ -1154,6 +1163,11 @@ static void mntput_no_expire(struct moun return; } lock_mount_hash(); + /* + * make sure that if __legitimize_mnt() has not seen us grab + * mount_lock, we'll see their refcount increment here. + */ + smp_mb(); mnt_add_count(mnt, -1); if (mnt_get_count(mnt)) { rcu_read_unlock();