| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/08/08 21:44 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": [
"BT",
"BT_HCIVHCI",
"BT_BREDR",
"BT_LE"
],
"FocusSymbols": [
"hci_send_acl",
"hci_send_sco",
"hci_send_iso"
],
"KMSANReasoning": "The patch adds a state check (`test_bit(HCI_UP, \u0026hdev-\u003eflags)`) before queuing TX work (`queue_work`) for ACL, SCO, and ISO data in the Bluetooth HCI core. This prevents queuing work when the HCI device is not in the UP state, which likely addresses a use-after-free, race condition, or NULL pointer dereference bug (e.g., if the workqueue is destroyed or the device is being torn down). These types of bugs are related to object lifetimes and concurrency, which are effectively detected by KASAN (for use-after-free) and standard kernel debugging tools. The patch does not introduce any new data structures, allocations, or modifications to data sent to user space. It does not involve any uninitialized memory reads or information leaks. Therefore, a dedicated KMSAN fuzzing session is not required.",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies core Bluetooth data transmission functions (hci_send_acl, hci_send_sco, hci_send_iso) to check if the device is up before queuing the transmission work. This prevents potential issues during device teardown and is reachable via virtual HCI devices.",
"WorthFuzzing": true
} |
| 1/1 | 2026/08/08 21:44 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit d47d30cd8cee15058ef8ba4e7add172448626ae1\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Sat Aug 8 21:44:09 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c\nindex 5ba9fe8261ec8..d9f091af36183 100644\n--- a/net/bluetooth/hci_core.c\n+++ b/net/bluetooth/hci_core.c\n@@ -3242,7 +3242,8 @@ void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)\n \n \thci_queue_acl(chan, \u0026chan-\u003edata_q, skb, flags);\n \n-\tqueue_work(hdev-\u003eworkqueue, \u0026hdev-\u003etx_work);\n+\tif (test_bit(HCI_UP, \u0026hdev-\u003eflags))\n+\t\tqueue_work(hdev-\u003eworkqueue, \u0026hdev-\u003etx_work);\n }\n \n /* Send SCO data */\n@@ -3267,7 +3268,8 @@ void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)\n \tbt_dev_dbg(hdev, \"hcon %p queued %d\", conn,\n \t\t skb_queue_len(\u0026conn-\u003edata_q));\n \n-\tqueue_work(hdev-\u003eworkqueue, \u0026hdev-\u003etx_work);\n+\tif (test_bit(HCI_UP, \u0026hdev-\u003eflags))\n+\t\tqueue_work(hdev-\u003eworkqueue, \u0026hdev-\u003etx_work);\n }\n \n /* Send ISO data */\n@@ -3338,7 +3340,8 @@ void hci_send_iso(struct hci_conn *conn, struct sk_buff *skb)\n \n \thci_queue_iso(conn, \u0026conn-\u003edata_q, skb);\n \n-\tqueue_work(hdev-\u003eworkqueue, \u0026hdev-\u003etx_work);\n+\tif (test_bit(HCI_UP, \u0026hdev-\u003eflags))\n+\t\tqueue_work(hdev-\u003eworkqueue, \u0026hdev-\u003etx_work);\n }\n \n /* ---- HCI TX task (outgoing data) ---- */\n"
} |
| 2/1 | 2026/08/08 21:44 | agent | patch-evaluator |
0mModel:best-expensive Args: null Results: {
"EnableConfigs": [
"BT",
"BT_HCIVHCI",
"BT_BREDR",
"BT_LE"
],
"FocusSymbols": [
"hci_send_acl",
"hci_send_sco",
"hci_send_iso"
],
"Reasoning": "The patch modifies core Bluetooth data transmission functions (hci_send_acl, hci_send_sco, hci_send_iso) to check if the device is up before queuing the transmission work. This prevents potential issues during device teardown and is reachable via virtual HCI devices.",
"WorthFuzzing": true
}Instruction: You are an expert Linux kernel maintainer. Your job is to review a provided patch series and determine if it makes functional changes to the kernel that should be fuzzed. IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively use your code access tools to examine the actual source code and confirm any assumptions. Return WorthFuzzing=false if the patch only contains: - Modifications to Documentation/, Kconfig files, or code comments. - Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints. - Changes to numeric constants or macros that do not functionally alter execution flow. - Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim). - Code in vendor-specific PCIe switch, SmartNIC, or GPU drivers (e.g., mlxsw, pds_core, qed, ionic, amdgpu) that require physical PCIe hardware cards not emulated in standard QEMU. - Driver .remove, .shutdown, or pci_unregister_driver teardown callbacks (e.g., igb_remove) that are executed only during PCI hot-unplug or sysfs driver unbind operations. If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. Prefer non-static, non-inlined API entrypoint functions over internal static helper functions (which are inlined by the compiler and do not have distinct symbol addresses). 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Also check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed for Kbuild to compile the code statically into vmlinux. List them in the EnableConfigs output array, and DO NOT add a 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4"). Prefer calling several tools at the same time to save round-trips. Use set-results tool to provide results of the analysis. It must be called exactly once before the final reply. Ignore results of this tool. Prompt: For your convenience, here is the diff of the changes:
commit d47d30cd8cee15058ef8ba4e7add172448626ae1
Author: syz-cluster <triage@syzkaller.com>
Date: Sat Aug 8 21:44:09 2026 +0000
syz-cluster: applied patch under review
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 5ba9fe8261ec8..d9f091af36183 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -3242,7 +3242,8 @@ void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
hci_queue_acl(chan, &chan->data_q, skb, flags);
- queue_work(hdev->workqueue, &hdev->tx_work);
+ if (test_bit(HCI_UP, &hdev->flags))
+ queue_work(hdev->workqueue, &hdev->tx_work);
}
/* Send SCO data */
@@ -3267,7 +3268,8 @@ void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)
bt_dev_dbg(hdev, "hcon %p queued %d", conn,
skb_queue_len(&conn->data_q));
- queue_work(hdev->workqueue, &hdev->tx_work);
+ if (test_bit(HCI_UP, &hdev->flags))
+ queue_work(hdev->workqueue, &hdev->tx_work);
}
/* Send ISO data */
@@ -3338,7 +3340,8 @@ void hci_send_iso(struct hci_conn *conn, struct sk_buff *skb)
hci_queue_iso(conn, &conn->data_q, skb);
- queue_work(hdev->workqueue, &hdev->tx_work);
+ if (test_bit(HCI_UP, &hdev->flags))
+ queue_work(hdev->workqueue, &hdev->tx_work);
}
/* ---- HCI TX task (outgoing data) ---- */
|
| 3/2 | 2026/08/08 21:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2298 output: 28 thoughts: 243 Thoughts: **My Assessment of a Bluetooth HCI Patch** Okay, so this patch in `net/bluetooth/hci_core.c` is making a critical check. It's looking to see if `HCI_UP` is set in `hdev->flags` before scheduling `hdev->tx_work` within `hci_send_acl`, `hci_send_sco`, and `hci_send_iso`. Essentially, it's preventing the queuing of transmit work when the Bluetooth device isn't fully initialized and active. This makes sense; skipping this check can lead to bad things happening, like use-after-free conditions or null pointer dereferences if the device is in the process of being shut down. That's a classic race condition scenario. Now, let's think about this from a fuzzing perspective. We've got to determine the reachability and vulnerability surface of those functions. `hci_send_acl`, `hci_send_sco`, and `hci_send_iso` are fundamental Bluetooth functions for transmitting ACL, SCO, and ISO data. These are core components, so they're absolutely reachable and prime targets for fuzzing. They handle the essential data transfer operations, so if there's a problem there, it's going to be a big one. Next, I need to figure out the configuration dependencies to enable this code. It looks like `CONFIG_BT` is the primary one, naturally. But, given the potential for different HCI implementations, I'll need to double-check `CONFIG_BT_HCIUART` or `CONFIG_BT_HCIVHCI` as well. Virtual HCI devices are often sources of subtle bugs. I'll take a quick look at `net/bluetooth/Kconfig` to confirm the exact dependencies and any relevant configurations that might impact the reachability of these functions. |
| 4/2 | 2026/08/08 21:44 | tool | grepper |
0mArgs:{
"Expression": "config BT",
"PathPrefix": "net/bluetooth/Kconfig"
}Results: {
"Output": "net/bluetooth/Kconfig-5-\nnet/bluetooth/Kconfig:6:menuconfig BT\nnet/bluetooth/Kconfig-7-\ttristate \"Bluetooth subsystem support\"\n--\nnet/bluetooth/Kconfig-41-\nnet/bluetooth/Kconfig:42:config BT_BREDR\nnet/bluetooth/Kconfig-43-\tbool \"Bluetooth Classic (BR/EDR) features\"\n--\nnet/bluetooth/Kconfig=56=source \"net/bluetooth/hidp/Kconfig\"\nnet/bluetooth/Kconfig-57-\nnet/bluetooth/Kconfig:58:config BT_LE\nnet/bluetooth/Kconfig-59-\tbool \"Bluetooth Low Energy (LE) features\"\n--\nnet/bluetooth/Kconfig-65-\nnet/bluetooth/Kconfig:66:config BT_LE_L2CAP_ECRED\nnet/bluetooth/Kconfig-67-\tbool \"Bluetooth L2CAP Enhanced Credit Flow Control\"\n--\nnet/bluetooth/Kconfig-76-\nnet/bluetooth/Kconfig:77:config BT_6LOWPAN\nnet/bluetooth/Kconfig-78-\ttristate \"Bluetooth 6LoWPAN support\"\n--\nnet/bluetooth/Kconfig-82-\nnet/bluetooth/Kconfig:83:config BT_LEDS\nnet/bluetooth/Kconfig-84-\tbool \"Enable LED triggers\"\n--\nnet/bluetooth/Kconfig-91-\nnet/bluetooth/Kconfig:92:config BT_MSFTEXT\nnet/bluetooth/Kconfig-93-\tbool \"Enable Microsoft extensions\"\n--\nnet/bluetooth/Kconfig-98-\nnet/bluetooth/Kconfig:99:config BT_AOSPEXT\nnet/bluetooth/Kconfig-100-\tbool \"Enable Android Open Source Project extensions\"\n--\nnet/bluetooth/Kconfig-105-\nnet/bluetooth/Kconfig:106:config BT_DEBUGFS\nnet/bluetooth/Kconfig-107-\tbool \"Export Bluetooth internals in debugfs\"\n--\nnet/bluetooth/Kconfig-113-\nnet/bluetooth/Kconfig:114:config BT_SELFTEST\nnet/bluetooth/Kconfig-115-\tbool \"Bluetooth self testing support\"\n--\nnet/bluetooth/Kconfig-126-\nnet/bluetooth/Kconfig:127:config BT_SELFTEST_ECDH\nnet/bluetooth/Kconfig-128-\tbool \"ECDH test cases\"\n--\nnet/bluetooth/Kconfig-133-\nnet/bluetooth/Kconfig:134:config BT_SELFTEST_SMP\nnet/bluetooth/Kconfig-135-\tbool \"SMP test cases\"\n--\nnet/bluetooth/Kconfig-140-\nnet/bluetooth/Kconfig:141:config BT_FEATURE_DEBUG\nnet/bluetooth/Kconfig-142-\tbool \"Enable runtime option for debugging statements\"\n"
} |
| 5/2 | 2026/08/08 21:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3659 output: 33 thoughts: 24 Thoughts: Okay, here's my take on those thoughts, framed as an expert's internal monologue: **Bluetooth Configuration Deep Dive** Alright, the core requirement here boils down to `BT`. That's the starting point. Time to drill down and see how we're handling the virtual HCI driver. My instinct is to head straight to `drivers/bluetooth/Kconfig`. That's the logical place to find the relevant configurations and any dependencies related to this virtual interface. Let's see what options are exposed there, and what other settings might influence this particular subsystem. I need to understand the full landscape of choices. |
| 6/2 | 2026/08/08 21:44 | tool | grepper |
0mArgs:{
"Expression": "config BT_HCIVHCI",
"PathPrefix": "drivers/bluetooth/Kconfig"
}Results: {
"Output": "drivers/bluetooth/Kconfig=327=config BT_HCIBFUSB\n--\ndrivers/bluetooth/Kconfig-339-\ndrivers/bluetooth/Kconfig:340:config BT_HCIVHCI\ndrivers/bluetooth/Kconfig-341-\ttristate \"HCI VHCI (Virtual HCI device) driver\"\n"
} |
| 7/2 | 2026/08/08 21:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3937 output: 105 thoughts: 47 Thoughts: Okay, here's my interpretation of those thoughts, tailored for an expert audience: **Analyzing Bluetooth Configuration Options and Transmission Functions** Alright, so I'm taking a look at Bluetooth configurations, and it seems like enabling `BT` and `BT_HCIVHCI` is a solid starting point. I'm assuming these are fundamental configurations likely related to basic Bluetooth functionality and possibly some kind of HCI-over-HCI setup, perhaps for testing or specific hardware integrations. Now, I need to drill down into the low-level transmission functions to understand how data is actually moving. My immediate focus is on the `hci_send_acl`, `hci_send_sco`, and `hci_send_iso` functions. I want to see how these are implemented within the selected configuration. These are the core primitives for sending asynchronous connectionless (ACL), synchronous connection-oriented (SCO), and isochronous (ISO) data respectively. I'll be looking for how the buffers are handled, any queueing strategies, interrupt mechanisms, and if there are any subtle differences across the implementations that could impact performance or latency in different scenarios. I'll be paying attention to any specific hardware dependencies or optimizations. |
| 8/2 | 2026/08/08 21:44 | tool | grepper |
0mArgs:{
"Expression": "void hci_send_acl",
"PathPrefix": "net/bluetooth/hci_core.c"
}Results: {
"Output": "net/bluetooth/hci_core.c=3183=static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,\n--\nnet/bluetooth/hci_core.c-3236-\nnet/bluetooth/hci_core.c:3237:void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)\nnet/bluetooth/hci_core.c-3238-{\n"
} |
| 9/2 | 2026/08/08 21:44 | tool | grepper |
0mArgs:{
"Expression": "void hci_send_sco",
"PathPrefix": "net/bluetooth/hci_core.c"
}Results: {
"Output": "net/bluetooth/hci_core.c=3237=void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)\n--\nnet/bluetooth/hci_core.c-3249-/* Send SCO data */\nnet/bluetooth/hci_core.c:3250:void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)\nnet/bluetooth/hci_core.c-3251-{\n"
} |
| 10/2 | 2026/08/08 21:44 | tool | grepper |
0mArgs:{
"Expression": "void hci_send_iso",
"PathPrefix": "net/bluetooth/hci_core.c"
}Results: {
"Output": "net/bluetooth/hci_core.c=3288=static void hci_queue_iso(struct hci_conn *conn, struct sk_buff_head *queue,\n--\nnet/bluetooth/hci_core.c-3334-\nnet/bluetooth/hci_core.c:3335:void hci_send_iso(struct hci_conn *conn, struct sk_buff *skb)\nnet/bluetooth/hci_core.c-3336-{\n"
} |
| 11/2 | 2026/08/08 21:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4723 output: 99 thoughts: 33 Thoughts: Okay, here's my interpretation of those thoughts, framed as my own: **Analyzing `net/bluetooth/hci_core.c` Exports** Alright, looking at `net/bluetooth/hci_core.c`, I need to quickly establish the scope of what I'm dealing with. My immediate question is: are these functions in this file, specifically, *exported*? Or, put another way, are they intended to be public, or non-static? I need to verify whether they're accessible outside of this specific compilation unit. Knowing this will immediately help me understand their intended use and how they interact with the broader Bluetooth stack. This is a standard initial diagnostic step when poking around in kernel code like this. I can't proceed efficiently without knowing if these functions are meant to be used internally or if they are interfaces. |
| 12/2 | 2026/08/08 21:44 | tool | grepper |
0mError:no matches Args: {
"Expression": "EXPORT_SYMBOL.*hci_send_acl",
"PathPrefix": "net/bluetooth/"
}Results: {
"error": "no matches"
} |
| 13/2 | 2026/08/08 21:44 | tool | grepper |
0mError:no matches Args: {
"Expression": "EXPORT_SYMBOL.*hci_send_sco",
"PathPrefix": "net/bluetooth/"
}Results: {
"error": "no matches"
} |
| 14/2 | 2026/08/08 21:44 | tool | grepper |
0mError:no matches Args: {
"Expression": "EXPORT_SYMBOL.*hci_send_iso",
"PathPrefix": "net/bluetooth/"
}Results: {
"error": "no matches"
} |
| 15/2 | 2026/08/08 21:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 5068 output: 87 thoughts: 54 Thoughts: **Investigating the Call Sites of Internal Bluetooth Functions** Okay, so these functions aren't explicitly *exported* from the `net/bluetooth/` directory, which is interesting. That means they're likely intended for internal use within that subsystem. But they're definitely being *called* from other files within this same directory, such as `l2cap_core.c`, `sco.c`, and `iso.c`. Given that I'm trying to understand the overall architecture, the next logical step is to pinpoint *exactly* where these functions are being invoked. I need to understand the dependencies and control flow within this Bluetooth implementation. So, I need to go through the code and identify all of their call sites within those files, and likely others in that directory, to get a clear picture of how they fit into the bigger picture. This will help me significantly in determining their purpose and how the Bluetooth stack operates internally. |
| 16/2 | 2026/08/08 21:44 | tool | grepper |
0mArgs:{
"Expression": "hci_send_acl",
"PathPrefix": "net/bluetooth/"
}Results: {
"Output": "net/bluetooth/hci_core.c=3183=static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue,\n--\nnet/bluetooth/hci_core.c-3236-\nnet/bluetooth/hci_core.c:3237:void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)\nnet/bluetooth/hci_core.c-3238-{\n--\nnet/bluetooth/l2cap_core.c=993=static void l2cap_send_acl(struct l2cap_conn *conn, struct sk_buff *skb,\n--\nnet/bluetooth/l2cap_core.c-997-\tif (hci_conn_valid(conn-\u003ehcon-\u003ehdev, conn-\u003ehcon))\nnet/bluetooth/l2cap_core.c:998:\t\thci_send_acl(conn-\u003ehchan, skb, flags);\nnet/bluetooth/l2cap_core.c-999-\telse\n--\nnet/bluetooth/l2cap_core.c=1028=static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)\n--\nnet/bluetooth/l2cap_core.c-1047-\tbt_cb(skb)-\u003eforce_active = test_bit(FLAG_FORCE_ACTIVE, \u0026chan-\u003eflags);\nnet/bluetooth/l2cap_core.c:1048:\thci_send_acl(chan-\u003econn-\u003ehchan, skb, flags);\nnet/bluetooth/l2cap_core.c-1049-}\n"
} |
| 17/2 | 2026/08/08 21:44 | tool | grepper |
0mArgs:{
"Expression": "hci_send_sco",
"PathPrefix": "net/bluetooth/"
}Results: {
"Output": "net/bluetooth/hci_core.c=3237=void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)\n--\nnet/bluetooth/hci_core.c-3249-/* Send SCO data */\nnet/bluetooth/hci_core.c:3250:void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)\nnet/bluetooth/hci_core.c-3251-{\n--\nnet/bluetooth/sco.c=404=static int sco_send_frame(struct sock *sk, struct sk_buff *skb,\n--\nnet/bluetooth/sco.c-416-\thci_setup_tx_timestamp(skb, 1, sockc);\nnet/bluetooth/sco.c:417:\thci_send_sco(conn-\u003ehcon, skb);\nnet/bluetooth/sco.c-418-\n"
} |
| 18/2 | 2026/08/08 21:44 | tool | grepper |
0mArgs:{
"Expression": "hci_send_iso",
"PathPrefix": "net/bluetooth/"
}Results: {
"Output": "net/bluetooth/hci_core.c=3288=static void hci_queue_iso(struct hci_conn *conn, struct sk_buff_head *queue,\n--\nnet/bluetooth/hci_core.c-3334-\nnet/bluetooth/hci_core.c:3335:void hci_send_iso(struct hci_conn *conn, struct sk_buff *skb)\nnet/bluetooth/hci_core.c-3336-{\n--\nnet/bluetooth/iso.c=605=static int iso_send_frame(struct sock *sk, struct sk_buff *skb,\n--\nnet/bluetooth/iso.c-627-\t\thci_setup_tx_timestamp(skb, 1, sockc);\nnet/bluetooth/iso.c:628:\t\thci_send_iso(conn-\u003ehcon, skb);\nnet/bluetooth/iso.c-629-\t} else {\n"
} |
| 19/2 | 2026/08/08 21:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 6298 output: 135 thoughts: 274 Thoughts: **My Analysis of the Bluetooth Fuzzing Target** Alright, this looks promising. These functions are definitely reachable and represent a good target for fuzzing. We're looking at `hci_send_acl`, `hci_send_sco`, and `hci_send_iso`, which handle Bluetooth data transmission. The patch touches these core functions, specifically related to virtual HCI devices. My initial thought is to make sure we have the correct configuration settings in place. I need to enable `BT` and `BT_HCIVHCI`, obviously. Let's make sure we're not missing anything. I think `BT_BREDR` and `BT_LE` will be necessary as well, considering they are likely used by ACL and ISO. I'll take another look at `net/bluetooth/Kconfig` to be sure. Yep, `BT_BREDR` enables "Bluetooth Classic (BR/EDR) features," and `BT_LE` enables "Bluetooth Low Energy (LE) features." We should definitely include them. Now, let's assemble the response. ``` WorthFuzzing: true Reasoning: The patch modifies core Bluetooth data transmission functions (hci_send_acl, hci_send_sco, hci_send_iso) to check if the device is up before queuing the transmission work. This prevents potential issues during device teardown and is reachable via virtual HCI devices. FocusSymbols: ["hci_send_acl", "hci_send_sco", "hci_send_iso"] EnableConfigs: ["BT", "BT_HCIVHCI", "BT_BREDR", "BT_LE"] ``` That should be a solid starting point for our fuzzing campaign. |
| 20/2 | 2026/08/08 21:44 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"BT",
"BT_HCIVHCI",
"BT_BREDR",
"BT_LE"
],
"FocusSymbols": [
"hci_send_acl",
"hci_send_sco",
"hci_send_iso"
],
"Reasoning": "The patch modifies core Bluetooth data transmission functions (hci_send_acl, hci_send_sco, hci_send_iso) to check if the device is up before queuing the transmission work. This prevents potential issues during device teardown and is reachable via virtual HCI devices.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"BT",
"BT_HCIVHCI",
"BT_BREDR",
"BT_LE"
],
"FocusSymbols": [
"hci_send_acl",
"hci_send_sco",
"hci_send_iso"
],
"Reasoning": "The patch modifies core Bluetooth data transmission functions (hci_send_acl, hci_send_sco, hci_send_iso) to check if the device is up before queuing the transmission work. This prevents potential issues during device teardown and is reachable via virtual HCI devices.",
"WorthFuzzing": true
} |
| 21/1 | 2026/08/08 21:44 | action | If |
0mArgs:{
"WorthFuzzing": true
}Results: null |
| 22/2 | 2026/08/08 21:44 | agent | kmsan-evaluator |
0mModel:best-expensive Args: null Results: {
"KMSANReasoning": "The patch adds a state check (`test_bit(HCI_UP, \u0026hdev-\u003eflags)`) before queuing TX work (`queue_work`) for ACL, SCO, and ISO data in the Bluetooth HCI core. This prevents queuing work when the HCI device is not in the UP state, which likely addresses a use-after-free, race condition, or NULL pointer dereference bug (e.g., if the workqueue is destroyed or the device is being torn down). These types of bugs are related to object lifetimes and concurrency, which are effectively detected by KASAN (for use-after-free) and standard kernel debugging tools. The patch does not introduce any new data structures, allocations, or modifications to data sent to user space. It does not involve any uninitialized memory reads or information leaks. Therefore, a dedicated KMSAN fuzzing session is not required.",
"NeedsKMSAN": false
}Instruction: You are an expert Linux kernel security engineer specializing in kernel memory
error detectors (KASAN and KMSAN). Your job is to review the provided patch series and
determine if the code changes justify spawning a dedicated KMSAN (KernelMemorySanitizer)
fuzzing session in addition to standard KASAN fuzzing.
CRITICAL DISTINCTION BETWEEN KASAN AND KMSAN:
- Standard KASAN kernel builds (upstream-apparmor-kasan.config) already enable
a comprehensive suite of debugging tools and sanitizers, including KASAN
(out-of-bounds accesses, use-after-free, double free, invalid free), LOCKDEP
(locking bugs and deadlocks), UB-sanitizers, and memory corruption checks.
- KMSAN (KernelMemorySanitizer) detects reads of UNINITIALIZED memory (stack, heap,
or page allocations) and kernel-to-user memory info-leaks.
Rule: THERE IS NO SENSE IN RUNNING A KMSAN SESSION IF A BUG CAN BE CAUGHT BY KASAN,
LOCKDEP, OR OTHER STANDARD BUG DETECTORS.
A dedicated KMSAN fuzzing session incurs significant resource costs. You must ONLY
set NeedsKMSAN=true if the code changes introduce or expose UNINITIALIZED MEMORY risks
that are detected ONLY by KMSAN.
Look holistically at the patch series and surrounding code. Even if no direct
uninitialized field accesses or new buffer allocations are added in the diff itself,
a patch may alter control flow, bounds checking, or data length calculations in ways
that change how the rest of the code operates on existing buffers (e.g. allowing
uninitialized stack/heap memory to be read, copied to user space, or used in control
flow). Do not hesitate to use your code access tools to inspect the surrounding code,
called functions, and callers.
Set NeedsKMSAN=true ONLY IF the patch introduces or modifies:
1. Kernel structures sent to user space (via copy_to_user, put_user, netlink skb
attributes, ioctl output arguments, socket options, or BPF buffers) where fields
or structure padding might not be fully initialized/zeroed.
2. Conditional logic or branching that depends on potentially uninitialized variables
or struct fields.
3. Allocation or initialization of complex data structures where uninitialized fields
could be read later in reachable code paths.
4. Bounds checks, lengths, or logic in a way that allows surrounding code to access
uninitialized bytes of existing buffers.
Set NeedsKMSAN=false IF:
- The code changes primarily risk out-of-bounds access, array overflows, NULL pointer
dereferences, locking deadlocks, or use-after-free bugs (these are already caught
by KASAN, LOCKDEP, or standard bug detectors).
- All stack/heap structures touched or introduced by the patch are fully zeroed
or initialized (e.g. using = {0}, memset, kzalloc) before being read or copied.
- The patch does not introduce any risk of uninitialized memory usage or info-leaks.
Use your code access tools to inspect the surrounding code if necessary, then provide
detailed KMSANReasoning contrasting KASAN vs KMSAN applicability for this patch.
Prefer calling several tools at the same time to save round-trips.
Use set-results tool to provide results of the analysis.
It must be called exactly once before the final reply.
Ignore results of this tool.
Prompt: For your convenience, here is the diff of the changes:
commit d47d30cd8cee15058ef8ba4e7add172448626ae1
Author: syz-cluster <triage@syzkaller.com>
Date: Sat Aug 8 21:44:09 2026 +0000
syz-cluster: applied patch under review
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 5ba9fe8261ec8..d9f091af36183 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -3242,7 +3242,8 @@ void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
hci_queue_acl(chan, &chan->data_q, skb, flags);
- queue_work(hdev->workqueue, &hdev->tx_work);
+ if (test_bit(HCI_UP, &hdev->flags))
+ queue_work(hdev->workqueue, &hdev->tx_work);
}
/* Send SCO data */
@@ -3267,7 +3268,8 @@ void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb)
bt_dev_dbg(hdev, "hcon %p queued %d", conn,
skb_queue_len(&conn->data_q));
- queue_work(hdev->workqueue, &hdev->tx_work);
+ if (test_bit(HCI_UP, &hdev->flags))
+ queue_work(hdev->workqueue, &hdev->tx_work);
}
/* Send ISO data */
@@ -3338,7 +3340,8 @@ void hci_send_iso(struct hci_conn *conn, struct sk_buff *skb)
hci_queue_iso(conn, &conn->data_q, skb);
- queue_work(hdev->workqueue, &hdev->tx_work);
+ if (test_bit(HCI_UP, &hdev->flags))
+ queue_work(hdev->workqueue, &hdev->tx_work);
}
/* ---- HCI TX task (outgoing data) ---- */
|
| 23/3 | 2026/08/08 21:44 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2295 output: 206 thoughts: 506 Thoughts: **Patch Analysis: Bluetooth HCI TX Workqueue Safeguard** Okay, so I'm looking at this patch and my initial thought is, "This looks like a solid fix." It seems to be addressing a potential concurrency issue within the Bluetooth HCI core, specifically related to the transmission of ACL, SCO, and ISO data. The patch introduces a check: `if (test_bit(HCI_UP, &hdev->flags))` before the `queue_work` calls in `hci_send_acl`, `hci_send_sco`, and `hci_send_iso`. Basically, it's ensuring that the device is actually "up" and running before submitting work to the workqueue. This is a smart move, because it prevents queuing work on a workqueue for a device that might be in the process of shutting down. My immediate assumption is that this patch is targeting a classic use-after-free (UAF) or NULL pointer dereference situation. If the device isn't up, the workqueue might be getting destroyed or isn't properly initialized. Trying to queue work in that scenario is a recipe for a crash, or worse, a UAF security vulnerability. This feels very much like a race condition or state machine issue. KASAN or standard kernel debuggers should flag this type of vulnerability pretty quickly. My next thought is, does this patch introduce any new risks, specifically uninitialized memory vulnerabilities? I need to be diligent here. Let's see... the patch is just adding a state check before an existing `queue_work` call. It's not introducing any new variables, allocations, or modifications to data structures that are sent to user space. It's purely about controlling the *timing* of the existing work queue operation. So, no, this patch doesn't look like it's going to trigger any KMSAN issues. It's more about protecting the existing code, rather than exposing it to new vulnerabilities. So, let me summarize my reasoning for clarity: This patch protects against a concurrency bug. It does this by checking if the HCI device is in the "UP" state before submitting work to the workqueue. This likely resolves a UAF, race condition, or NULL pointer dereference. The fix itself involves only a conditional, so it doesn't present new uninitialized memory or information leak risks, so KMSAN isn't relevant here. KASAN or other standard tools are more appropriate to check this. |
| 24/3 | 2026/08/08 21:44 | tool | set-results |
0mArgs:{
"KMSANReasoning": "The patch adds a state check (`test_bit(HCI_UP, \u0026hdev-\u003eflags)`) before queuing TX work (`queue_work`) for ACL, SCO, and ISO data in the Bluetooth HCI core. This prevents queuing work when the HCI device is not in the UP state, which likely addresses a use-after-free, race condition, or NULL pointer dereference bug (e.g., if the workqueue is destroyed or the device is being torn down). These types of bugs are related to object lifetimes and concurrency, which are effectively detected by KASAN (for use-after-free) and standard kernel debugging tools. The patch does not introduce any new data structures, allocations, or modifications to data sent to user space. It does not involve any uninitialized memory reads or information leaks. Therefore, a dedicated KMSAN fuzzing session is not required.",
"NeedsKMSAN": false
}Results: {
"KMSANReasoning": "The patch adds a state check (`test_bit(HCI_UP, \u0026hdev-\u003eflags)`) before queuing TX work (`queue_work`) for ACL, SCO, and ISO data in the Bluetooth HCI core. This prevents queuing work when the HCI device is not in the UP state, which likely addresses a use-after-free, race condition, or NULL pointer dereference bug (e.g., if the workqueue is destroyed or the device is being torn down). These types of bugs are related to object lifetimes and concurrency, which are effectively detected by KASAN (for use-after-free) and standard kernel debugging tools. The patch does not introduce any new data structures, allocations, or modifications to data sent to user space. It does not involve any uninitialized memory reads or information leaks. Therefore, a dedicated KMSAN fuzzing session is not required.",
"NeedsKMSAN": false
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|