Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp1411397pxb; Fri, 21 Jan 2022 18:03:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJxDWzMqfWpNYcLVmqK0BCMGgi013IwfTXgm1hu6aiwNkgyGEs25RT/B6B/g07NM74Auc2Xq X-Received: by 2002:a17:90a:c08f:: with SMTP id o15mr3307577pjs.204.1642817012653; Fri, 21 Jan 2022 18:03:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642817012; cv=none; d=google.com; s=arc-20160816; b=eBAxsI8Fu7fCg16H2TLrul7nMOLnKk7QbBDjO3TTGjtvijC3kNx3AlHLBJL3hBXgvX HHpqHx8fTKrvyAYIeECJe13yibRu9fN2UnIzPV8KPFqYaM3c64Qu/UiNHvYrMmYn5n5R XWX8ejAsAqDq4fJUF9HTIYAsZJFOfQaavGBYA9LV9+vo5hbILLEhNf3N0NYAlbvlBm4e 4XbwdQezXdJSIRDLI0tQqsDKxGRDPvrcLd3mGutPt0LZV7qs24tdIJN56aKVLfNLK3T8 eLZhPzmWkRxYiBO86pwobGs0CwCKExjtYTGcan1zxwGZ5r+8M6Wcmplwf+AdL4cukgPj Rf7g== 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 :message-id:date:subject:cc:to:from; bh=6lhogNLiBPQVXxlVaQb3nDoefpPrdkWIKoHAtUm3dPY=; b=FrbQ8DMb0h+I65BRMcNd5FUBhnrXOJs2WyuP2Ti3SZIgd/lV33sc6dzW+zfG0qSQvz eUTPWY7ububqyxSZ0hoLH6valLYL9W2YlsMIl9qiPIkhmj3S9I61yOxRMj4KSEwZF8YF W95uc2AzqVZm8tmWsB7w1UdqHfhLxkpg6hgNTrPqtWsyh2ybmz+S80aUT2Nr+jwHxUSF ujfjIskA8/s4pRl3legwArTzoWPVeW+Z7vYKG37zl1+exrv8ECIYHBxL7sPtxTI9Ns+h cgV+YK9Gh/QeK+V7O62GIg7ouHw7uGzsr2TbdpwDQc4VRbgFSJczfT7GLWzicEK86Vx7 dr8w== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 207si8115958pga.681.2022.01.21.18.03.20; Fri, 21 Jan 2022 18:03:32 -0800 (PST) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1380763AbiAURhH (ORCPT + 99 others); Fri, 21 Jan 2022 12:37:07 -0500 Received: from giacobini.uberspace.de ([185.26.156.129]:43118 "EHLO giacobini.uberspace.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1351642AbiAURhD (ORCPT ); Fri, 21 Jan 2022 12:37:03 -0500 Received: (qmail 14399 invoked by uid 990); 21 Jan 2022 17:37:00 -0000 Authentication-Results: giacobini.uberspace.de; auth=pass (plain) From: Soenke Huster To: Marcel Holtmann , Johan Hedberg , Luiz Augusto von Dentz , "David S. Miller" , Jakub Kicinski Cc: Soenke Huster , linux-bluetooth@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH] Bluetooth: hci_event: Ignore multiple conn complete events Date: Fri, 21 Jan 2022 18:36:22 +0100 Message-Id: <20220121173622.192744-1-soenke.huster@eknoes.de> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Bar: / X-Rspamd-Report: BAYES_HAM(-2.999998) R_MISSING_CHARSET(0.5) MIME_GOOD(-0.1) MID_CONTAINS_FROM(1) SUSPICIOUS_RECIPS(1.5) X-Rspamd-Score: -0.099998 Received: from unknown (HELO unkown) (::1) by giacobini.uberspace.de (Haraka/2.8.28) with ESMTPSA; Fri, 21 Jan 2022 18:37:00 +0100 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When a HCI_CONNECTION_COMPLETE event is received multiple times for the same handle, the device is registered multiple times which leads to memory corruptions. Therefore, consequent events for a single connection are ignored. The conn->state can hold different values so conn->handle is checked to detect whether a connection is already set up. Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=215497 Signed-off-by: Soenke Huster --- This fixes the referenced bug and several use-after-free issues I discovered. I tagged it as RFC, as I am not 100% sure if checking the existence of the handle is the correct approach, but to the best of my knowledge it must be set for the first time in this function for valid connections of this event, therefore it should be fine. net/bluetooth/hci_event.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 681c623aa380..71ccb12c928d 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -3106,6 +3106,17 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data, } } + /* The HCI_Connection_Complete event is only sent once per connection. + * Processing it more than once per connection can corrupt kernel memory. + * + * As the connection handle is set here for the first time, it indicates + * whether the connection is already set up. + */ + if (conn->handle) { + bt_dev_err(hdev, "Ignoring HCI_Connection_Complete for existing connection"); + goto unlock; + } + if (!ev->status) { conn->handle = __le16_to_cpu(ev->handle); -- 2.34.1