From: "gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>
To: Oleh Konko <security@1seal.org>
Cc: "linux-bluetooth@vger.kernel.org"
<linux-bluetooth@vger.kernel.org>,
"marcel@holtmann.org" <marcel@holtmann.org>,
"luiz.dentz@gmail.com" <luiz.dentz@gmail.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"stable@vger.kernel.org" <stable@vger.kernel.org>
Subject: Re: [PATCH v3] Bluetooth: hci_event: move wake reason storage into validated event handlers
Date: Thu, 26 Mar 2026 15:57:39 +0100 [thread overview]
Message-ID: <2026032626-rinsing-component-ed00@gregkh> (raw)
In-Reply-To: <9b8a0917d56b4a67ba541e8a5eb3abb8.security@1.0.0.127.in-addr.arpa>
On Thu, Mar 26, 2026 at 01:32:50PM +0000, Oleh Konko wrote:
> From f0e8b2abaf4a895fad81756277014582c773808d Mon Sep 17 00:00:00 2001
> From: Oleh Konko <security@1seal.org>
> Date: Thu, 26 Mar 2026 14:29:58 +0100
> Subject: [PATCH v3] Bluetooth: hci_event: move wake reason storage into
> validated event handlers
If you use git send-email, the header will not be in the body like this.
> hci_store_wake_reason() is called from hci_event_packet() immediately
> after stripping the HCI event header but before hci_event_func()
> enforces the per-event minimum payload length from hci_ev_table.
> This means a short HCI event frame can reach bacpy() before any bounds
> check runs.
>
> Rather than duplicating skb parsing and per-event length checks inside
> hci_store_wake_reason(), move wake-address storage into the individual
> event handlers after their existing event-length validation has
> succeeded. Convert hci_store_wake_reason() into a small helper that only
> stores an already-validated bdaddr while the caller holds hci_dev_lock().
> Use the same helper after hci_event_func() with a NULL address to
> preserve the existing unexpected-wake fallback semantics when no
> validated event handler records a wake address.
>
> Call the helper from hci_conn_request_evt(), hci_conn_complete_evt(),
> hci_le_adv_report_evt(), hci_le_ext_adv_report_evt(), and
> hci_le_direct_adv_report_evt().
>
> Fixes: 2f20216c1d6f ("Bluetooth: Emit controller suspend and resume events")
> Cc: stable@vger.kernel.org
> Signed-off-by: Oleh Konko <security@1seal.org>
> ---
> v3:
> - route the unexpected-wake fallback through hci_store_wake_reason(NULL, 0)
> after hci_event_func(), as suggested in review
>
> net/bluetooth/hci_event.c | 89 +++++++++++++--------------------------
> 1 file changed, 29 insertions(+), 60 deletions(-)
>
> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> index 286529d2e..c0e0b4a1c 100644
> --- a/net/bluetooth/hci_event.c
> +++ b/net/bluetooth/hci_event.c
> @@ -80,6 +80,9 @@ static void *hci_le_ev_skb_pull(struct hci_dev *hdev, struct sk_buff *skb,
> return data;
> }
>
> +static void hci_store_wake_reason(struct hci_dev *hdev,
> + const bdaddr_t *bdaddr, u8 addr_type);
> +
> static u8 hci_cc_inquiry_cancel(struct hci_dev *hdev, void *data,
> struct sk_buff *skb)
> {
> @@ -3111,6 +3114,7 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data,
> bt_dev_dbg(hdev, "status 0x%2.2x", status);
>
> hci_dev_lock(hdev);
> + hci_store_wake_reason(hdev, &ev->bdaddr, BDADDR_BREDR);
>
> /* Check for existing connection:
> *
> @@ -3274,6 +3278,10 @@ static void hci_conn_request_evt(struct hci_dev *hdev, void *data,
>
> bt_dev_dbg(hdev, "bdaddr %pMR type 0x%x", &ev->bdaddr, ev->link_type);
>
> + hci_dev_lock(hdev);
> + hci_store_wake_reason(hdev, &ev->bdaddr, BDADDR_BREDR);
> + hci_dev_unlock(hdev);
> +
> /* Reject incoming connection from device with same BD ADDR against
> * CVE-2020-26555
> */
> @@ -6403,6 +6411,8 @@ static void hci_le_adv_report_evt(struct hci_dev *hdev, void *data,
> info->length + 1))
> break;
>
> + hci_store_wake_reason(hdev, &info->bdaddr, info->bdaddr_type);
> +
> if (info->length <= max_adv_len(hdev)) {
> rssi = info->data[info->length];
> process_adv_report(hdev, info->type, &info->bdaddr,
> @@ -6491,6 +6501,8 @@ static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, void *data,
> info->length))
> break;
>
> + hci_store_wake_reason(hdev, &info->bdaddr, info->bdaddr_type);
> +
> evt_type = __le16_to_cpu(info->type) & LE_EXT_ADV_EVT_TYPE_MASK;
> legacy_evt_type = ext_evt_type_to_legacy(hdev, evt_type);
>
> @@ -6834,6 +6846,8 @@ static void hci_le_direct_adv_report_evt(struct hci_dev *hdev, void *data,
> for (i = 0; i < ev->num; i++) {
> struct hci_ev_le_direct_adv_info *info = &ev->info[i];
>
> + hci_store_wake_reason(hdev, &info->bdaddr, info->bdaddr_type);
> +
> process_adv_report(hdev, info->type, &info->bdaddr,
> info->bdaddr_type, &info->direct_addr,
> info->direct_addr_type, HCI_ADV_PHY_1M, 0,
> @@ -7517,73 +7531,27 @@ static bool hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
> return true;
> }
>
> -static void hci_store_wake_reason(struct hci_dev *hdev, u8 event,
> - struct sk_buff *skb)
> +/* hdev lock must be held. pass NULL bdaddr to record an unexpected wake. */
> +static void hci_store_wake_reason(struct hci_dev *hdev,
> + const bdaddr_t *bdaddr, u8 addr_type)
If the lock must be held, why aren't you both adding the static test for
this at build time __must_hold(), and the runtime lock test so that we
know this lock is held? That way any changes in any code paths in the
future will properly trigger at build and runtime to know to be fixed
up.
thanks,
greg k-h
next prev parent reply other threads:[~2026-03-26 14:58 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-26 13:32 [PATCH v3] Bluetooth: hci_event: move wake reason storage into validated event handlers Oleh Konko
2026-03-26 14:57 ` gregkh [this message]
[not found] ` <PA4PR04MB767961D26B5B1D402A7328AF9256A@PA4PR04MB7679.eurprd04.prod.outlook.com>
[not found] ` <PA4PR04MB76792C61C4A06C089ACC4A689256A@PA4PR04MB7679.eurprd04.prod.outlook.com>
2026-03-26 16:34 ` Luiz Augusto von Dentz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2026032626-rinsing-component-ed00@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=linux-bluetooth@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=marcel@holtmann.org \
--cc=security@1seal.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox