Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp4479205ybx; Mon, 4 Nov 2019 14:06:50 -0800 (PST) X-Google-Smtp-Source: APXvYqxGUGOL/d5q0uK3WN7HMnJ5w53FhvFEjj5fA9OzfuwCNjp76Fl+YnODzc+2vxp3auJflvuh X-Received: by 2002:aa7:df85:: with SMTP id b5mr31945590edy.298.1572905210172; Mon, 04 Nov 2019 14:06:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1572905210; cv=none; d=google.com; s=arc-20160816; b=zcKNwaSlxOoOsLHdLinFeau1IE2IUVbtjsakj5zztu81VniQQSzdhggzoNs0Py1J6+ vMxXsm6Fm4fnbg6lWUroX6H1VjfMqKc/IoFTCFXMj10cJoZXPXh0TW/dBCxDxlOYI589 wELIN/3BefpzUIXUNH8OHfJQZJZcQZD3IoGGbcIihfvY+o+dCSyZFZXUBkKl6R4UpRNn 8dn2Emhx9RtZPzbitlWE8zNh54QNH1iBpwOGjLqI+gj3E5FrYrblrtbYtgSFtW74WXGO vZKiYQh18mNLq27Kbyku9dDqrZNMD/C+0AZHBS7u56hDvyE8CZvcfe7z14n88JazWecQ ygxQ== 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=dWt0X1/xod5TJ2xucwLka4qUvFgCwW3WEHKS4HAiSXI=; b=KxDpVW2aZLhjACrturDwHsU0FyjKY9golbUBWRy5RjxXj7l4AkeFQ2mFKiBBtAvOA0 WQ+faBFGQ+f4n5iumS/IaqyAihI2MANXe3IstCtRzZBBOswJfOZSuJu2yMp5jsNSpRC3 vDDr6VbrkRR51NBQVQLZio/xS2rPtlpLGQlArobvGRiOnAZWkcx6MuU23gJ9wVZjitTS AtJdCN9NUg2VM3lii+SX9ynHp9hyn1Q4THTp6PakBtcmDGZifVzBsel+S+64cW3ayw2o Jtl/EDk1yjExZ5v6+f5EbK8a/JH2aYdasW9mwm+A9p6y7JY1ODK3Sfr8cb5QsSo6EILL hGAQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=c0yrNFtU; 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 a3si5132324eju.377.2019.11.04.14.06.27; Mon, 04 Nov 2019 14:06:50 -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=c0yrNFtU; 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 S2389462AbfKDWDK (ORCPT + 99 others); Mon, 4 Nov 2019 17:03:10 -0500 Received: from mail.kernel.org ([198.145.29.99]:33394 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389452AbfKDWDG (ORCPT ); Mon, 4 Nov 2019 17:03:06 -0500 Received: from localhost (6.204-14-84.ripe.coltfrance.com [84.14.204.6]) (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 0C10F205C9; Mon, 4 Nov 2019 22:03:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1572904985; bh=IpYPmy4gmiZam1d7YuHwmPD3cJ6PWCD00aouV9b9iUo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c0yrNFtUxsXQatgc7gL3LCMikXzfaoQnqQvDg7gBzBA5vnsoPU7mOjDcxfOSWybg0 nqg59GWubcygby4QrTMYhYz1d/2oBaHwPYqWyJ0DwaAm2lwrlGdsp3WLUmRKHNy+uv jLrNp4TPf+SVNAiIU6palRaknPf1rZu+nxHbp+B4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, syzbot+b9be979c55f2bea8ed30@syzkaller.appspotmail.com, David Howells Subject: [PATCH 4.19 140/149] rxrpc: Fix trace-after-put looking at the put peer record Date: Mon, 4 Nov 2019 22:45:33 +0100 Message-Id: <20191104212146.540148141@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191104212126.090054740@linuxfoundation.org> References: <20191104212126.090054740@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 55f6c98e3674ce16038a1949c3f9ca5a9a99f289 upstream. rxrpc_put_peer() calls trace_rxrpc_peer() after it has done the decrement of the refcount - which looks at the debug_id in the peer record. But unless the refcount was reduced to zero, we no longer have the right to look in the record and, indeed, it may be deleted by some other thread. Fix this by getting the debug_id out before decrementing the refcount and then passing that into the tracepoint. This can cause the following symptoms: BUG: KASAN: use-after-free in __rxrpc_put_peer net/rxrpc/peer_object.c:411 [inline] BUG: KASAN: use-after-free in rxrpc_put_peer+0x685/0x6a0 net/rxrpc/peer_object.c:435 Read of size 8 at addr ffff888097ec0058 by task syz-executor823/24216 Fixes: 1159d4b496f5 ("rxrpc: Add a tracepoint to track rxrpc_peer refcounting") Reported-by: syzbot+b9be979c55f2bea8ed30@syzkaller.appspotmail.com Signed-off-by: David Howells Signed-off-by: Greg Kroah-Hartman --- include/trace/events/rxrpc.h | 6 +++--- net/rxrpc/peer_object.c | 11 +++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) --- a/include/trace/events/rxrpc.h +++ b/include/trace/events/rxrpc.h @@ -527,10 +527,10 @@ TRACE_EVENT(rxrpc_local, ); TRACE_EVENT(rxrpc_peer, - TP_PROTO(struct rxrpc_peer *peer, enum rxrpc_peer_trace op, + TP_PROTO(unsigned int peer_debug_id, enum rxrpc_peer_trace op, int usage, const void *where), - TP_ARGS(peer, op, usage, where), + TP_ARGS(peer_debug_id, op, usage, where), TP_STRUCT__entry( __field(unsigned int, peer ) @@ -540,7 +540,7 @@ TRACE_EVENT(rxrpc_peer, ), TP_fast_assign( - __entry->peer = peer->debug_id; + __entry->peer = peer_debug_id; __entry->op = op; __entry->usage = usage; __entry->where = where; --- a/net/rxrpc/peer_object.c +++ b/net/rxrpc/peer_object.c @@ -385,7 +385,7 @@ struct rxrpc_peer *rxrpc_get_peer(struct int n; n = atomic_inc_return(&peer->usage); - trace_rxrpc_peer(peer, rxrpc_peer_got, n, here); + trace_rxrpc_peer(peer->debug_id, rxrpc_peer_got, n, here); return peer; } @@ -399,7 +399,7 @@ struct rxrpc_peer *rxrpc_get_peer_maybe( if (peer) { int n = atomic_fetch_add_unless(&peer->usage, 1, 0); if (n > 0) - trace_rxrpc_peer(peer, rxrpc_peer_got, n + 1, here); + trace_rxrpc_peer(peer->debug_id, rxrpc_peer_got, n + 1, here); else peer = NULL; } @@ -430,11 +430,13 @@ static void __rxrpc_put_peer(struct rxrp void rxrpc_put_peer(struct rxrpc_peer *peer) { const void *here = __builtin_return_address(0); + unsigned int debug_id; int n; if (peer) { + debug_id = peer->debug_id; n = atomic_dec_return(&peer->usage); - trace_rxrpc_peer(peer, rxrpc_peer_put, n, here); + trace_rxrpc_peer(debug_id, rxrpc_peer_put, n, here); if (n == 0) __rxrpc_put_peer(peer); } @@ -447,10 +449,11 @@ void rxrpc_put_peer(struct rxrpc_peer *p void rxrpc_put_peer_locked(struct rxrpc_peer *peer) { const void *here = __builtin_return_address(0); + unsigned int debug_id = peer->debug_id; int n; n = atomic_dec_return(&peer->usage); - trace_rxrpc_peer(peer, rxrpc_peer_put, n, here); + trace_rxrpc_peer(debug_id, rxrpc_peer_put, n, here); if (n == 0) { hash_del_rcu(&peer->hash_link); list_del_init(&peer->keepalive_link);