Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp8560859ybl; Thu, 16 Jan 2020 19:37:33 -0800 (PST) X-Google-Smtp-Source: APXvYqyo1P1DqREwHuzn03nvFQgohg9KSfSsHa33QMqbHj2KK+RMiYBw5vzIz+WKVjXG+7sqdEC+ X-Received: by 2002:a9d:7590:: with SMTP id s16mr4427666otk.89.1579232253050; Thu, 16 Jan 2020 19:37:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579232253; cv=none; d=google.com; s=arc-20160816; b=jHmCU6ntbom2IewH4kN2HODIboJn8oXwJkPYEHeW6uyKES2v7tHzRDfup7Ix6iJB4g akrdumHgHKxpTkjWSKa+0D8T98zcyCNDo0/ZBKwAvPhBqZPLXEs1gqFbuqvC7c4YK4Is JVnUhTCpqWH1fkkY6YetFoaMt81KIO6hrr0cbGY/UfnP3elDokYG1Uh70wYKbbtlA0OJ b5U/qOl8WWqoqMtKh4GyNs4gCT4zz+5MYWQp+SUrjEI0ZtG9Ia5RWhywRMILTDkASUdp Iayd53Afwg8wYAk6QwMqtUjhJPlrE+/zZHf2FgWwQdmC0XeTiB7Mh2NR5oBSnzHCdlzS 4hiA== 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=RpBS51Oot4pl6DLOvEKt1HWLweaeYUpNGOnO4b1kOa0=; b=rWXOYWOzHp1Bf2+kTwvwc13xw/4UrbD27vbjy8KDCk/CREGwXdX5ipW6KdxnmC9Zck jLWcDMVwvxAWoavPOm9GaXtLZEr5YpY3WrLi1LeOeOHBSW6PtmDrKn5ladbYGp+zaEbE eOMpau2sHwoBaq0oAT8wJzrwG7I5UO/vTPaVr2WMcY2wAnbUk6SSy1kPmYntC+AN/DvF Z8qDpXjJirbPpQEbheI5uwiwk6ll9x2cIj8zUAhtIKvuTZKl7qCLQu5slvdSyL3G4kkb 3XrPlUWGU8ie5pgaqS+vNnWfhmyUniSlWap22XSyI3l1DWPG4kyzmupREi0DDM0b0MgE gCWw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Z9cbGZw+; 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 t142si12843902oih.242.2020.01.16.19.37.21; Thu, 16 Jan 2020 19:37:33 -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=Z9cbGZw+; 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 S2391955AbgAPXqJ (ORCPT + 99 others); Thu, 16 Jan 2020 18:46:09 -0500 Received: from mail.kernel.org ([198.145.29.99]:50122 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387782AbgAPXWU (ORCPT ); Thu, 16 Jan 2020 18:22:20 -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 5702C2073A; Thu, 16 Jan 2020 23:22:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579216939; bh=wHSHb/MDBqahkrdh6IvxEuw+l7mYeRaaQEPep9xZhdw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z9cbGZw+LM7M+oMuBbbd68Z+b5Odof7ujVoOPkEADDLSOTI83bVryXgiEzoYWBUpQ sBQDea9Poihj5l8Inxv1lgJJpXX7SEZallpNWsaSM57NKDJklo6fUgO44Paj6Ojitn /hlkfUDRnOV6a9rHq6GRWAqroorTJ25ue+wtUjuY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Al Viro , David Howells , Linus Torvalds Subject: [PATCH 5.4 082/203] afs: Fix use-after-loss-of-ref Date: Fri, 17 Jan 2020 00:16:39 +0100 Message-Id: <20200116231752.179454016@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200116231745.218684830@linuxfoundation.org> References: <20200116231745.218684830@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: David Howells commit 40a708bd622b78582ae3d280de29b09b50bd04c0 upstream. afs_lookup() has a tracepoint to indicate the outcome of d_splice_alias(), passing it the inode to retrieve the fid from. However, the function gave up its ref on that inode when it called d_splice_alias(), which may have failed and dropped the inode. Fix this by caching the fid. Fixes: 80548b03991f ("afs: Add more tracepoints") Reported-by: Al Viro Signed-off-by: David Howells Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- fs/afs/dir.c | 12 +++++++----- include/trace/events/afs.h | 12 +++--------- 2 files changed, 10 insertions(+), 14 deletions(-) --- a/fs/afs/dir.c +++ b/fs/afs/dir.c @@ -908,6 +908,7 @@ static struct dentry *afs_lookup(struct unsigned int flags) { struct afs_vnode *dvnode = AFS_FS_I(dir); + struct afs_fid fid = {}; struct inode *inode; struct dentry *d; struct key *key; @@ -957,15 +958,16 @@ static struct dentry *afs_lookup(struct dentry->d_fsdata = (void *)(unsigned long)dvnode->status.data_version; } + + if (!IS_ERR_OR_NULL(inode)) + fid = AFS_FS_I(inode)->fid; + d = d_splice_alias(inode, dentry); if (!IS_ERR_OR_NULL(d)) { d->d_fsdata = dentry->d_fsdata; - trace_afs_lookup(dvnode, &d->d_name, - inode ? AFS_FS_I(inode) : NULL); + trace_afs_lookup(dvnode, &d->d_name, &fid); } else { - trace_afs_lookup(dvnode, &dentry->d_name, - IS_ERR_OR_NULL(inode) ? NULL - : AFS_FS_I(inode)); + trace_afs_lookup(dvnode, &dentry->d_name, &fid); } return d; } --- a/include/trace/events/afs.h +++ b/include/trace/events/afs.h @@ -915,9 +915,9 @@ TRACE_EVENT(afs_call_state, TRACE_EVENT(afs_lookup, TP_PROTO(struct afs_vnode *dvnode, const struct qstr *name, - struct afs_vnode *vnode), + struct afs_fid *fid), - TP_ARGS(dvnode, name, vnode), + TP_ARGS(dvnode, name, fid), TP_STRUCT__entry( __field_struct(struct afs_fid, dfid ) @@ -928,13 +928,7 @@ TRACE_EVENT(afs_lookup, TP_fast_assign( int __len = min_t(int, name->len, 23); __entry->dfid = dvnode->fid; - if (vnode) { - __entry->fid = vnode->fid; - } else { - __entry->fid.vid = 0; - __entry->fid.vnode = 0; - __entry->fid.unique = 0; - } + __entry->fid = *fid; memcpy(__entry->name, name->name, __len); __entry->name[__len] = 0; ),