Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp493672ybl; Tue, 28 Jan 2020 06:49:58 -0800 (PST) X-Google-Smtp-Source: APXvYqyu7ZsarZ0P3Rkg9gzE9fjd3MR7EHyAC0Q2TqDpeRC+rToO41dwaeRcQXw/IqPR/xf72NNP X-Received: by 2002:a05:6808:9b4:: with SMTP id e20mr2921365oig.37.1580222998358; Tue, 28 Jan 2020 06:49:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580222998; cv=none; d=google.com; s=arc-20160816; b=NGr5rB/dgZLXy4Q+47jKM9ksR6Ct7MGkwF3Ws4pNrBkD8NSYPg+9PG7TZQbf3r0Q8+ 9kmFybjY8r8haCyiXM6CnYaBxZeNfQg3xrNrc7k5s68YNhIwdvRT1U3zahvCQGbZ73m4 CG7XedxR0w9ldWSCT7bl87qTnF3InyGnBVXCE89DY8Uskby1TYYzL8WOzXz5sX7xT3jV WW8tPsl1U/gGTbyM7R5Si6fNQfis5yIB20wdPNM+xs6Z2Lj4mN38dO69PMJH15tznt2b l2G3Dyc5rH83iIxE72115QlPr6050BGh5tU3VxGrtRAg5G0CxY0JaCzqGYvP8GQx/7yF Koqg== 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=8ng9j8NaI9p+vHwMpJJsDFdkNWJE4ZxrwWrLlOJdva8=; b=cOcuA+A+EnbM+hirkTFGrCf9/HHTZpuxzvn17pH5f8o7RG5qcl3g2BSaaC/FyOZlyJ dxvlIuTSrtAntxepdIxqqTnsHkHogeCET1Cxfimgk8Lvor2lotZe09n2rR6sQK8FvoF5 mof7z/UJlJVenTK3jdoaJWGdFJjQrrYEl+LgBBUXiLU7x7FOcBeZ9mLnG/tGRBp3E4Cc U2F5nU5Sk8szKiggnwid4fqpV9LNM+U98/qQJr+rIGuh258KAQM7mHe3GjvYlI/omjGT 7q5DpcqI0goV8tuvWefB13p9dlwsO+Pbg9QLsKQFi9usj2heOTheFH+eOBsKReYyQ3Fr +wsw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=0QFGBWnV; 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 r5si4997918oic.19.2020.01.28.06.49.46; Tue, 28 Jan 2020 06:49:58 -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=0QFGBWnV; 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 S1727198AbgA1OsY (ORCPT + 99 others); Tue, 28 Jan 2020 09:48:24 -0500 Received: from mail.kernel.org ([198.145.29.99]:48938 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726766AbgA1OCf (ORCPT ); Tue, 28 Jan 2020 09:02:35 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.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 0BA8024695; Tue, 28 Jan 2020 14:02:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1580220154; bh=jFBkBZpR37Xa506YkLZCDaF6CQW7L2QeG0BSlqy/7Fc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=0QFGBWnViUzI8nRODgViJUaF6nLzTpw6pnJDKAIe+DpTLoyQ3BUuEb/CObgtGti9Q UuRg2KxQJUzblwm87YL808+aKk9IN83bXHevd/QI/KvyzdzRPGL4FK/xKkMHL6Uf36 r9V7WLztZDMFAOG5c4XylOimKN/dmaWo1qC43264= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jeff Layton , "Yan, Zheng" , Ilya Dryomov Subject: [PATCH 5.4 037/104] ceph: hold extra reference to r_parent over life of request Date: Tue, 28 Jan 2020 14:59:58 +0100 Message-Id: <20200128135822.575355015@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200128135817.238524998@linuxfoundation.org> References: <20200128135817.238524998@linuxfoundation.org> User-Agent: quilt/0.66 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 From: Jeff Layton commit 9c1c2b35f1d94de8325344c2777d7ee67492db3b upstream. Currently, we just assume that it will stick around by virtue of the submitter's reference, but later patches will allow the syscall to return early and we can't rely on that reference at that point. While I'm not aware of any reports of it, Xiubo pointed out that this may fix a use-after-free. If the wait for a reply times out or is canceled via signal, and then the reply comes in after the syscall returns, the client can end up trying to access r_parent without a reference. Take an extra reference to the inode when setting r_parent and release it when releasing the request. Cc: stable@vger.kernel.org Signed-off-by: Jeff Layton Reviewed-by: "Yan, Zheng" Signed-off-by: Ilya Dryomov Signed-off-by: Greg Kroah-Hartman --- fs/ceph/mds_client.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -708,8 +708,10 @@ void ceph_mdsc_release_request(struct kr /* avoid calling iput_final() in mds dispatch threads */ ceph_async_iput(req->r_inode); } - if (req->r_parent) + if (req->r_parent) { ceph_put_cap_refs(ceph_inode(req->r_parent), CEPH_CAP_PIN); + ceph_async_iput(req->r_parent); + } ceph_async_iput(req->r_target_inode); if (req->r_dentry) dput(req->r_dentry); @@ -2670,8 +2672,10 @@ int ceph_mdsc_submit_request(struct ceph /* take CAP_PIN refs for r_inode, r_parent, r_old_dentry */ if (req->r_inode) ceph_get_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); - if (req->r_parent) + if (req->r_parent) { ceph_get_cap_refs(ceph_inode(req->r_parent), CEPH_CAP_PIN); + ihold(req->r_parent); + } if (req->r_old_dentry_dir) ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir), CEPH_CAP_PIN);