Received: by 2002:a4a:311b:0:0:0:0:0 with SMTP id k27-v6csp4805109ooa; Tue, 14 Aug 2018 10:47:31 -0700 (PDT) X-Google-Smtp-Source: AA+uWPxd0eU2d920vDaJII7JPPsJ+NQKeh7pg1+XCsDV9dKMbRF7zzF0JwsdEIuyvRO439Ljjrol X-Received: by 2002:a63:1902:: with SMTP id z2-v6mr21636054pgl.86.1534268851042; Tue, 14 Aug 2018 10:47:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534268851; cv=none; d=google.com; s=arc-20160816; b=lWdt83MmTFZKo6OQ5zp+9kUqiFgZFdiNCXoDxB0y77EFZtN9VxGmdXO/2CDRIoofqb tRI1k4q4K1YTFkwDytrr7a81aYsLr9KONMTvcHI7pDhBJ6yXqs99VhiTbq0sjEpmsauN EEzAqbJXk7xlKEqsg4hmmT+mX3IkQHxK2Grti8ttJx5z0eSxBSTb7DaX7zRlkNGuiPoE wJKU8r+dWEjZEAHqLlRRe2CL6WXdhXGtbY5hiWoxccYqyrNxQellx4OCPNuLo/on9GHM KGdAHQLrso67gPP5r5yYJw1Qg/8xEmf4+ofSnQYSEvVw2Pz7dRHx2TCq2cGJ2Maue7gu InKQ== 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=UfVewys1ig4OOxeJLy0tNCAqRI3QtpetENUUrvXqbEQ=; b=RER4XTQlw3mhrIGLrYtzhFT4zmQuBW6/0o2cvhUO8c9DA2QafZsf/wOzE88zkAuNo+ +NvFfB0dpQ4llh9dtG3uJQ5hhL083GiD8v9KH4qYjddMIcA6YasT5pQF9BaJYdo7xHqz ynXM+UcHZUJeyWy3FpqDy6BOpvGyOv0ObEvqMkQAu+cGOcg7o21Wg3/FmvtsD2mFlR6c g2DtNcpjZUJXpexKqhNz3VGP0WAzda9NrQKHC8APzGtq6HIq07nj3Oz1MHaT6m1ffvgS VijLLSPw2pj7kyP2/+7I0zcjjp0ZI6Q5rQP6orBmhVklFt91n1UK5Lv1jp35a60u9BGi ufHg== 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 f34-v6si16764594ple.365.2018.08.14.10.47.16; Tue, 14 Aug 2018 10:47:31 -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 S2391003AbeHNUeQ (ORCPT + 99 others); Tue, 14 Aug 2018 16:34:16 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:60330 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390473AbeHNUeP (ORCPT ); Tue, 14 Aug 2018 16:34:15 -0400 Received: from localhost (unknown [194.244.16.108]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 6C7E9CA5; Tue, 14 Aug 2018 17:46:03 +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.4 12/43] fix __legitimize_mnt()/mntput() race Date: Tue, 14 Aug 2018 19:17:48 +0200 Message-Id: <20180814171517.896244329@linuxfoundation.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180814171517.014285600@linuxfoundation.org> References: <20180814171517.014285600@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.4-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; } @@ -1139,6 +1148,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();