Received: by 2002:a05:6a10:6d25:0:0:0:0 with SMTP id gq37csp1866752pxb; Mon, 13 Sep 2021 07:12:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxXKZWf/B5vsPlzi1EBTIZn2voU/8xUNkIcRXSpRaUO2VclTfYDv8ZNDR6TqT4Yifs0cF+2 X-Received: by 2002:a17:906:d9dc:: with SMTP id qk28mr12289723ejb.359.1631542353159; Mon, 13 Sep 2021 07:12:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631542353; cv=none; d=google.com; s=arc-20160816; b=vo9FHFIw84I6KWAfbVhOfydQNac2cWC25eL3NnAsbTB66XJuW4pc9vw9hvteXNU1/P Rt5nNI/qc8Y8qO3p/sdHpef636gMgcxaz56l2FkyQEZwTC8CMHXSdVDZHoVCNYyLTTVw 6w8DovJ82R93Vqk97vhFmMAdT7OW+ZKOD/Y/OUTiZ6bSqnIYbBQmYTo4L5Sz3/3v7Isu dsD4lvz3CStF/lQvj/u/UAqBGRi8lP4mx9JYeMzeOXzHCRZ127hhsOr0/VQTHMqtQAkN uubxEc/IbH6tpnyz9W2y7NWPfDTOpIG61TjuiSgRGXt2xbKZbfiGVbJKGbdjGKp/xoLu 1rhA== 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=xHIuEuZ3mEnbQeCSZtEVSm1uEhQ47H/4aJfCE++/Kes=; b=v83N7VPlnzyuUZ5j5B53/RiYQxBeD1KDwdnD0sA6TgQ9uAeGgl2dmrqGT+o9pXwKnW RPWtCg9bsjYMq/UTvqZvCWBwKK1Tn1cePm2f2iNk2db4wPzW0M9WtkV05EKxXAAPZ868 TcjtCSDzIVfMs7VLdLym+Io7bvGZpnOuyiG/B0sqNcBKJCm7D5onmxjRDMF8ZV8GFnD8 y1qPj8/XqWVX/U8SX7dpExRWMrvQTDeb0BQYw5jJ/18EyUdHs18mcXxo4FJP94Xy20QX mqm0Jqm/vWBrrYtko/mc6IM7lvKJIeIAr60RH7k9gort5Y8+oRT/I7DbvASw9Ra+Hedk FFew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=w8Gy7fGd; 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 l14si6399016edv.494.2021.09.13.07.12.08; Mon, 13 Sep 2021 07:12:33 -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=w8Gy7fGd; 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 S1344129AbhIMOI7 (ORCPT + 99 others); Mon, 13 Sep 2021 10:08:59 -0400 Received: from mail.kernel.org ([198.145.29.99]:56012 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344610AbhIMOFQ (ORCPT ); Mon, 13 Sep 2021 10:05:16 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D565861269; Mon, 13 Sep 2021 13:39:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1631540388; bh=ovj2dHtuEL0E6nt/2T8arqcn3LibHZn3l4vSyNwBUP0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=w8Gy7fGdr+OVeTR9Fd+7Z5hK8NeeG4RjG3TjCK+MSdsAzzVsAGUGNtv2zdLTL+CUb jJV7VBCYYappJu+NoamADr9Af79ge3u28OuHJCU8PM7wyuSvLp4ZcLOAbUdNpeIzk6 p9DUc8StEj2w8H/EbUSxAhyd5fom7yxAnUChsjVc= 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.13 173/300] Bluetooth: fix repeated calls to sco_sock_kill Date: Mon, 13 Sep 2021 15:13:54 +0200 Message-Id: <20210913131115.244683276@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210913131109.253835823@linuxfoundation.org> References: <20210913131109.253835823@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 a7b4555f312f..9769a7ceb689 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