Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp167542pxb; Mon, 13 Sep 2021 16:05:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxNDGYFwkMHXN3GoCX3QFrPJAa5aoZqrN0+BfW5EEvfKUm34CSS9HX7v4mU4ufcaQ2XT/+l X-Received: by 2002:aa7:c38c:: with SMTP id k12mr13727139edq.45.1631574336560; Mon, 13 Sep 2021 16:05:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631574336; cv=none; d=google.com; s=arc-20160816; b=WuHI05A/k/HY3YFyGre1IUAe9Ma9qNBORfGjCVdBR5NrjJBcc1dnZjOnshKU/z0/Rq GLewnHvRUo7SIktm+EgpkGX8SCSZJEGaoQekoTxmX6iFzW8wYSdL8CXafCrHA9kTfSk0 +fPWC2EPIqwE5XxpgcuWNbRQUCRUMAD2i/d4/HhKsCm2WQPKxGPwaOrqZj+FiQ9ZU5Xo VVbtlvO1wiUJWJg2xK0Z5YlSC3A47KnVTLO+4sCmR44m8OxUwx/CipgTHRdg34+zIitz rbuuRcIHj8wUcRZYsRB0Vo4VawYwv/SmlADImWY02gEzzoI5WrPXpFnuG3H1d0wg0R6T okHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=XGqjOsxytT73gnhEB0bPlwjKkomrVaBeR+VKzWQUjLE=; b=sC6/idBHd6/wMX2lDLNDQGrNsOxN/sTQIBFHZ1ohV5VN4eJIe5sFdopPrdpiF2PcjA I2akGV4MJGsFR2xhVt4pT/AELblx58d9vsWuI2p9wDbQQCyVRJw63iwC0LyQpK+EDvoT AUMMU3joYiBjgqYfBqqB2jU7AbyD1UbHfkcDjHnlVC3dYXsvq5zBdnB1gHOHU3PJQ7AY 6R7mxruN9uPoYVENUkku30ciTcE4PFC3qSHRNEg3SBILjcB3x4YRF4pAiwaQZLovWO3c xbRrfsXxCBChjtp6MpirhSWjtgd9ied+vYZ0GNr/tHlNKAcYSMtYHBG5LlU4t0lmc50f sMEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=gxzlXz4+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o8si8529138edi.429.2021.09.13.16.05.11; Mon, 13 Sep 2021 16:05:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=gxzlXz4+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346695AbhIMOj2 (ORCPT + 99 others); Mon, 13 Sep 2021 10:39:28 -0400 Received: from mail.kernel.org ([198.145.29.99]:51398 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346866AbhIMOdw (ORCPT ); Mon, 13 Sep 2021 10:33:52 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5544A61BAA; Mon, 13 Sep 2021 13:52:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1631541174; bh=nUaN+e/rMaznYW6qUtAFGngpB+uCUdXDNng9cPePsso=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gxzlXz4+y538+6zndimkQyARd/iRgx5/jYQwBVvOkvYl9Kp4YsoJZTgvVv2XCvEWG PYhhbN18NhNK9Z0vN00gOT7woH/KkIz5fOFg/uC1zRDi/3YVPheHglChzWQDt3lQW2 iq4o/nl/9XqxVOLskq8TxruT+zu9HKuoc0G82CTM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Desmond Cheong Zhi Xi , Luiz Augusto von Dentz , Sasha Levin Subject: [PATCH 5.14 193/334] Bluetooth: fix repeated calls to sco_sock_kill Date: Mon, 13 Sep 2021 15:14:07 +0200 Message-Id: <20210913131119.905525737@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210913131113.390368911@linuxfoundation.org> References: <20210913131113.390368911@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Desmond Cheong Zhi Xi [ Upstream commit e1dee2c1de2b4dd00eb44004a4bda6326ed07b59 ] In commit 4e1a720d0312 ("Bluetooth: avoid killing an already killed socket"), a check was added to sco_sock_kill to skip killing a socket if the SOCK_DEAD flag was set. This was done after a trace for a use-after-free bug showed that the same sock pointer was being killed twice. Unfortunately, this check prevents sco_sock_kill from running on any socket. sco_sock_kill kills a socket only if it's zapped and orphaned, however sock_orphan announces that the socket is dead before detaching it. i.e., orphaned sockets have the SOCK_DEAD flag set. To fix this, we remove the check for SOCK_DEAD, and avoid repeated calls to sco_sock_kill by removing incorrect calls in: 1. sco_sock_timeout. The socket should not be killed on timeout as further processing is expected to be done. For example, sco_sock_connect sets the timer then waits for the socket to be connected or for an error to be returned. 2. sco_conn_del. This function should clean up resources for the connection, but the socket itself should be cleaned up in sco_sock_release. 3. sco_sock_close. Calls to sco_sock_close in sco_sock_cleanup_listen and sco_sock_release are followed by sco_sock_kill. Hence the duplicated call should be removed. Fixes: 4e1a720d0312 ("Bluetooth: avoid killing an already killed socket") Signed-off-by: Desmond Cheong Zhi Xi Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- net/bluetooth/sco.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index ffa2a77a3e4c..b5ab842c7c4a 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -85,7 +85,6 @@ static void sco_sock_timeout(struct timer_list *t) sk->sk_state_change(sk); bh_unlock_sock(sk); - sco_sock_kill(sk); sock_put(sk); } @@ -177,7 +176,6 @@ static void sco_conn_del(struct hci_conn *hcon, int err) sco_sock_clear_timer(sk); sco_chan_del(sk, err); bh_unlock_sock(sk); - sco_sock_kill(sk); sock_put(sk); } @@ -394,8 +392,7 @@ static void sco_sock_cleanup_listen(struct sock *parent) */ static void sco_sock_kill(struct sock *sk) { - if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket || - sock_flag(sk, SOCK_DEAD)) + if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) return; BT_DBG("sk %p state %d", sk, sk->sk_state); @@ -447,7 +444,6 @@ static void sco_sock_close(struct sock *sk) lock_sock(sk); __sco_sock_close(sk); release_sock(sk); - sco_sock_kill(sk); } static void sco_skb_put_cmsg(struct sk_buff *skb, struct msghdr *msg, -- 2.30.2