| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/09/10 20:21 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"KMSANReasoning": "",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies the Intel 2.5G Ethernet (igc) driver to support ACPI MAC address passthrough for Thunderbolt/USB4-attached devices during igc_probe. This code requires physical Intel I225/I226 series Ethernet hardware connected via Thunderbolt, which is not emulated or available in standard virtualized fuzzing environments (QEMU/GCE). Thus, the modified code is structurally unreachable.",
"WorthFuzzing": false
} |
| 1/1 | 2026/09/10 20:21 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 84e7b8bd2858b13c5bfc3d846e7449054f3f7f60\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Thu Sep 10 20:21:18 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c\nindex 1fb5f3cbe93c5..abffd385f3e8c 100644\n--- a/drivers/net/ethernet/intel/igc/igc_main.c\n+++ b/drivers/net/ethernet/intel/igc/igc_main.c\n@@ -1,6 +1,8 @@\n // SPDX-License-Identifier: GPL-2.0\n /* Copyright (c) 2018 Intel Corporation */\n \n+#include \u003clinux/acpi.h\u003e\n+#include \u003clinux/hex.h\u003e\n #include \u003clinux/module.h\u003e\n #include \u003clinux/types.h\u003e\n #include \u003clinux/if_vlan.h\u003e\n@@ -7106,6 +7108,58 @@ static enum hrtimer_restart igc_qbv_scheduling_timer(struct hrtimer *timer)\n \treturn HRTIMER_NORESTART;\n }\n \n+static bool igc_get_acpi_mac_passthru(u8 *mac)\n+{\n+\tstatic const struct {\n+\t\tconst char *name;\n+\t\tacpi_object_type type;\n+\t\tu32 length;\n+\t} sources[] = {\n+\t\t{ \"\\\\_SB.AMAC\", ACPI_TYPE_BUFFER, 23 },\n+\t\t{ \"\\\\MACA\", ACPI_TYPE_STRING, 22 },\n+\t};\n+\tstruct acpi_buffer buffer;\n+\tunion acpi_object *obj;\n+\tbool mac_found = false;\n+\tacpi_status status;\n+\tu8 buf[ETH_ALEN];\n+\tint i;\n+\n+\tif (!IS_ENABLED(CONFIG_ACPI))\n+\t\treturn false;\n+\n+\tfor (i = 0; i \u003c ARRAY_SIZE(sources) \u0026\u0026 !mac_found; i++) {\n+\t\tbuffer.length = ACPI_ALLOCATE_BUFFER;\n+\t\tbuffer.pointer = NULL;\n+\n+\t\tstatus = acpi_evaluate_object(NULL, (char *)sources[i].name,\n+\t\t\t\t\t NULL, \u0026buffer);\n+\t\tif (ACPI_FAILURE(status))\n+\t\t\tcontinue;\n+\n+\t\tobj = buffer.pointer;\n+\t\tif (!obj || obj-\u003etype != sources[i].type ||\n+\t\t obj-\u003estring.length != sources[i].length ||\n+\t\t !obj-\u003estring.pointer)\n+\t\t\tgoto free_obj;\n+\n+\t\tif (strncmp(obj-\u003estring.pointer, \"_AUXMAC_#\", 9) ||\n+\t\t obj-\u003estring.pointer[21] != '#')\n+\t\t\tgoto free_obj;\n+\n+\t\tif (hex2bin(buf, obj-\u003estring.pointer + 9, ETH_ALEN) ||\n+\t\t !is_valid_ether_addr(buf))\n+\t\t\tgoto free_obj;\n+\n+\t\tether_addr_copy(mac, buf);\n+\t\tmac_found = true;\n+free_obj:\n+\t\tACPI_FREE(obj);\n+\t}\n+\n+\treturn mac_found;\n+}\n+\n /**\n * igc_probe - Device Initialization Routine\n * @pdev: PCI device information struct\n@@ -7272,6 +7326,22 @@ static int igc_probe(struct pci_dev *pdev,\n \t\t/* copy the MAC address out of the NVM */\n \t\tif (hw-\u003emac.ops.read_mac_addr(hw))\n \t\t\tdev_err(\u0026pdev-\u003edev, \"NVM Read Error\\n\");\n+\n+\t\t/* For devices behind a Thunderbolt/USB4 dock, look for a\n+\t\t * system-provided MAC in the ACPI table\n+\t\t */\n+\t\tif (pci_is_thunderbolt_attached(pdev) \u0026\u0026\n+\t\t igc_get_acpi_mac_passthru(hw-\u003emac.addr)) {\n+\t\t\t/* Set the permanent MAC address. Leave blank if invalid to\n+\t\t\t * reflect there is something wrong with the NVM MAC.\n+\t\t\t */\n+\t\t\tif (is_valid_ether_addr(hw-\u003emac.perm_addr))\n+\t\t\t\tether_addr_copy(netdev-\u003eperm_addr, hw-\u003emac.perm_addr);\n+\t\t\tnetdev-\u003eaddr_assign_type = NET_ADDR_STOLEN;\n+\t\t\tdev_info(\u0026pdev-\u003edev,\n+\t\t\t\t \"Using ACPI pass-thru MAC addr %pM\\n\",\n+\t\t\t\t hw-\u003emac.addr);\n+\t\t}\n \t}\n \n \teth_hw_addr_set(netdev, hw-\u003emac.addr);\n"
} |
| 2/1 | 2026/09/10 20:21 | agent | patch-evaluator |
0mModel:core Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Intel 2.5G Ethernet (igc) driver to support ACPI MAC address passthrough for Thunderbolt/USB4-attached devices during igc_probe. This code requires physical Intel I225/I226 series Ethernet hardware connected via Thunderbolt, which is not emulated or available in standard virtualized fuzzing environments (QEMU/GCE). Thus, the modified code is structurally unreachable.",
"WorthFuzzing": false
}Instruction: You are an expert Linux kernel maintainer and security engineer.
Your job is to review a provided patch series and evaluate whether it warrants fuzzing with syzkaller.
IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in
your workspace. Do NOT rely on internal assumptions. You must actively use your code access
tools to inspect the actual source code, callers, and surrounding context.
================================================================================
1. CORE TRIAGE PHILOSOPHY
================================================================================
The goal of patch fuzzing is to discover crashes, regressions, exposed latent bugs,
and newly triggered assertions introduced by the patch series.
- REACHABILITY IS THE PRIMARY GATE:
Fuzzing can only discover bugs in code that can actually execute in standard virtualized
environments (GCE or QEMU, utilizing software-emulated devices like USB gadgets, netdev, tun/tap).
If the modified code is structurally unreachable (see Section 2), it MUST NOT be fuzzed,
regardless of whether it adds assertions or complex logic.
- DO NOT BLINDLY TRUST "NO FUNCTIONAL CHANGE" (NFCI) OR "REFACTORING" CLAIMS:
Patch authors routinely label changes as "cleanups", "refactorings", or state
"No functional change intended". Do NOT take these claims at face value.
Code refactorings that rearrange logic, introduce helper functions, or alter state management
in core subsystems frequently introduce subtle semantic shifts or uncover latent kernel bugs.
If reachable executable code is modified or refactored, it MUST be fuzzed.
- NEW OR MODIFIED ASSERTIONS IN REACHABLE CODE MUST BE FUZZED:
When a patch introduces or modifies runtime checks or assertions (e.g., WARN_ON*, VM_WARN_ON*,
BUG_ON*, lockdep_assert*) in reachable code paths, it enforces new or stricter invariants.
Even if the author believes the invariant always holds, fuzzing is essential to verify whether
an unusual sequence of operations can violate it.
================================================================================
2. WHEN TO RETURN WorthFuzzing=false (NEGATIVE CRITERIA)
================================================================================
Return WorthFuzzing=false ONLY IF all modified code falls strictly into one or more of these categories:
- Non-kernel and non-executable changes:
* Modifications to Documentation/, comments, or spelling fixes.
* User-space directories, self-tests, samples, or scripts (e.g., tools/, samples/, scripts/, usr/)
that do not affect the compiled kernel image (vmlinux) or kernel modules.
* Purely decorative logging (e.g., message strings in pr_err, printk, dev_info) or tracepoints
that do not alter control flow or data structures.
* Build system or Kconfig changes that do not alter compiled C logic.
- Structurally unreachable hardware:
* Vendor-specific PCIe switches, SmartNICs, or GPU drivers (e.g., mlxsw, pds_core, qed,
ionic, amdgpu) requiring physical ASIC/PCIe cards not emulated in standard QEMU.
- Unreachable execution paths:
* Driver teardown callbacks (.remove, .shutdown, pci_unregister_driver) executed only during
physical PCI hot-unplug or manual sysfs driver unbinding.
* Code paths exclusive to architectures other than the target architecture.
================================================================================
3. WHEN TO RETURN WorthFuzzing=true (POSITIVE CRITERIA)
================================================================================
Return WorthFuzzing=true whenever the patch touches reachable executable code, including:
- Core Subsystems:
* Any logic modifications in memory management (mm/), synchronization/locking (kernel/locking/),
BPF, scheduler, core networking, VFS, or syscall handling.
- Refactorings and Code Cleanups:
* Any restructuring of reachable data structures, helper abstractions, or algorithm flows.
- Runtime Assertions and Defensive Checks:
* Any introduction or alteration of assertions (WARN_ON*, VM_WARN_ON*, BUG_ON*, etc.) in reachable paths.
- Reachable Drivers and Protocols:
* Drivers accessible via virtual buses (virtio, USB gadget, loopback, netlink, binder, sockets, etc.).
================================================================================
4. EXTRACTING FocusSymbols (PREVENTING DILUTION)
================================================================================
When WorthFuzzing=true, you must extract specific kernel functions into FocusSymbols to guide the fuzzer:
- AVOID UBIQUITOUS LIFECYCLE HOT-PATHS:
Do NOT list generic, ubiquitous functions called by almost every program in the corpus
(including, but not limited to: general memory allocators and deallocators, page fault
and trap handlers, or core synchronization primitives; this is not an exhaustive list).
Listing ubiquitous functions causes the fuzzer to classify thousands of unrelated tests as "focused",
which severely dilutes fuzzing effort away from the actual changes.
- TARGET SPECIFIC FEATURE LOGIC AND ENTRYPOINTS:
List functions that specifically implement the logic being added or altered, or direct API entrypoints
for the subsystem feature under review.
- HANDLING STATIC INLINE FUNCTIONS IN HEADERS (.h):
Compiler-inlined static functions (such as static inlines in mm/*.h or include/linux/*.h) lack
distinct symbol addresses in vmlinux and cannot be targeted directly by symbol coverage filters.
If the changes are primarily in static inline helpers, identify non-static, feature-specific caller
functions in .c files that exercise them (avoiding ubiquitous lifecycle wrappers).
================================================================================
5. IDENTIFYING EnableConfigs
================================================================================
Identify any specific CONFIG_ options required to properly compile and reach the modified code:
- Inspect Kconfig files and #ifdef guards; do not make assumptions.
- Check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed.
- Strip any '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: Target architecture: amd64
For your convenience, here is the diff of the changes:
commit 84e7b8bd2858b13c5bfc3d846e7449054f3f7f60
Author: syz-cluster <triage@syzkaller.com>
Date: Thu Sep 10 20:21:18 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
index 1fb5f3cbe93c5..abffd385f3e8c 100644
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
@@ -1,6 +1,8 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2018 Intel Corporation */
+#include <linux/acpi.h>
+#include <linux/hex.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/if_vlan.h>
@@ -7106,6 +7108,58 @@ static enum hrtimer_restart igc_qbv_scheduling_timer(struct hrtimer *timer)
return HRTIMER_NORESTART;
}
+static bool igc_get_acpi_mac_passthru(u8 *mac)
+{
+ static const struct {
+ const char *name;
+ acpi_object_type type;
+ u32 length;
+ } sources[] = {
+ { "\\_SB.AMAC", ACPI_TYPE_BUFFER, 23 },
+ { "\\MACA", ACPI_TYPE_STRING, 22 },
+ };
+ struct acpi_buffer buffer;
+ union acpi_object *obj;
+ bool mac_found = false;
+ acpi_status status;
+ u8 buf[ETH_ALEN];
+ int i;
+
+ if (!IS_ENABLED(CONFIG_ACPI))
+ return false;
+
+ for (i = 0; i < ARRAY_SIZE(sources) && !mac_found; i++) {
+ buffer.length = ACPI_ALLOCATE_BUFFER;
+ buffer.pointer = NULL;
+
+ status = acpi_evaluate_object(NULL, (char *)sources[i].name,
+ NULL, &buffer);
+ if (ACPI_FAILURE(status))
+ continue;
+
+ obj = buffer.pointer;
+ if (!obj || obj->type != sources[i].type ||
+ obj->string.length != sources[i].length ||
+ !obj->string.pointer)
+ goto free_obj;
+
+ if (strncmp(obj->string.pointer, "_AUXMAC_#", 9) ||
+ obj->string.pointer[21] != '#')
+ goto free_obj;
+
+ if (hex2bin(buf, obj->string.pointer + 9, ETH_ALEN) ||
+ !is_valid_ether_addr(buf))
+ goto free_obj;
+
+ ether_addr_copy(mac, buf);
+ mac_found = true;
+free_obj:
+ ACPI_FREE(obj);
+ }
+
+ return mac_found;
+}
+
/**
* igc_probe - Device Initialization Routine
* @pdev: PCI device information struct
@@ -7272,6 +7326,22 @@ static int igc_probe(struct pci_dev *pdev,
/* copy the MAC address out of the NVM */
if (hw->mac.ops.read_mac_addr(hw))
dev_err(&pdev->dev, "NVM Read Error\n");
+
+ /* For devices behind a Thunderbolt/USB4 dock, look for a
+ * system-provided MAC in the ACPI table
+ */
+ if (pci_is_thunderbolt_attached(pdev) &&
+ igc_get_acpi_mac_passthru(hw->mac.addr)) {
+ /* Set the permanent MAC address. Leave blank if invalid to
+ * reflect there is something wrong with the NVM MAC.
+ */
+ if (is_valid_ether_addr(hw->mac.perm_addr))
+ ether_addr_copy(netdev->perm_addr, hw->mac.perm_addr);
+ netdev->addr_assign_type = NET_ADDR_STOLEN;
+ dev_info(&pdev->dev,
+ "Using ACPI pass-thru MAC addr %pM\n",
+ hw->mac.addr);
+ }
}
eth_hw_addr_set(netdev, hw->mac.addr);
|
| 3/2 | 2026/09/10 20:21 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 3811 output: 36 thoughts: 472 Thoughts: **Analyzing a Patch for Syzkaller Fuzzing Suitability** Okay, so I need to assess this patch for fuzzing potential with syzkaller. The user wants a thumbs-up or down on its suitability, so let's dig in. I see it modifies `drivers/net/ethernet/intel/igc/igc_main.c`. Specifically, it adds a new function, `igc_get_acpi_mac_passthru(u8 *mac)`, and then calls it within `igc_probe()`. The logic seems to be about copying MAC addresses if the device is a Thunderbolt device, setting `addr_assign_type` to `NET_ADDR_STOLEN`, etc. Now, the crucial question: can we reach this code path in a standard QEMU environment? I need to think this through. My initial thought is to check against my mental list of excluded hardware. Aha, the syzkaller documentation lists "Structurally unreachable hardware." It mentions things like vendor-specific PCIe switches, SmartNICs, and GPUs requiring physical ASICs. But is `igc` in that category? Let's refresh my memory. Right, `igc` is that Intel 2.5G Ethernet Controller – the I225/I226 series. So, is it an easily emulated network device, or is it going to need some special hardware configuration? I know QEMU handles `e1000`, `e1000e`, and more recently `igb`. Does QEMU support `igc`? I need to look that up. Even if it's not directly emulated, I'm thinking I should check if it's fundamentally reachable. Does it have PCI IDs that are common and can be found by looking at drivers/net/ethernet/intel/igc/ and grepper. Alright, I need to get my hands dirty. I'll need to check the QEMU documentation and then dig into the `igc` driver code and do some quick searches to determine if this is a path we can realistically fuzz, or if it's locked behind a hardware requirement. |
| 4/2 | 2026/09/10 20:21 | tool | grepper |
0mArgs:{
"Expression": "igc_probe",
"PathPrefix": "drivers/net/ethernet/intel/igc/"
}Results: {
"Output": "drivers/net/ethernet/intel/igc/igc_main.c=7111=static bool igc_get_acpi_mac_passthru(u8 *mac)\n--\ndrivers/net/ethernet/intel/igc/igc_main.c-7163-/**\ndrivers/net/ethernet/intel/igc/igc_main.c:7164: * igc_probe - Device Initialization Routine\ndrivers/net/ethernet/intel/igc/igc_main.c-7165- * @pdev: PCI device information struct\n--\ndrivers/net/ethernet/intel/igc/igc_main.c-7169- *\ndrivers/net/ethernet/intel/igc/igc_main.c:7170: * igc_probe initializes an adapter identified by a pci_dev structure.\ndrivers/net/ethernet/intel/igc/igc_main.c-7171- * The OS initialization, configuring the adapter private structure,\n--\ndrivers/net/ethernet/intel/igc/igc_main.c-7173- */\ndrivers/net/ethernet/intel/igc/igc_main.c:7174:static int igc_probe(struct pci_dev *pdev,\ndrivers/net/ethernet/intel/igc/igc_main.c-7175-\t\t const struct pci_device_id *ent)\n--\ndrivers/net/ethernet/intel/igc/igc_main.c=7818=static struct pci_driver igc_driver = {\n--\ndrivers/net/ethernet/intel/igc/igc_main.c-7820-\t.id_table = igc_pci_tbl,\ndrivers/net/ethernet/intel/igc/igc_main.c:7821:\t.probe = igc_probe,\ndrivers/net/ethernet/intel/igc/igc_main.c-7822-\t.remove = igc_remove,\n"
} |
| 5/2 | 2026/09/10 20:21 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 5298 output: 121 thoughts: 657 Thoughts: **My Assessment: Structurally Unreachable Code for Fuzzing** Okay, let's break this down systematically. I need to determine if this change to the `igc` driver is worth fuzzing. First, I need to check the rules regarding physical PCI devices. The rules explicitly state that hardware structurally unreachable like vendor-specific PCIe switches, or in this case, a physical Intel I225/I226 NIC is not emulated in standard QEMU environments. Looking at the code, specifically `igc_probe()`, it's clear this is where the new functionality, `igc_get_acpi_mac_passthru`, is introduced. Crucially, this code path is *only* taken if `pci_is_thunderbolt_attached(pdev)` is true. This means the NIC is connected through Thunderbolt/USB4 and the ACPI MAC is being passed through. In a standard virtualized fuzzing setup, like QEMU with syzkaller, we're *not* going to have physical Intel I225/I226 NICs connected via Thunderbolt docks. Therefore, this PCI probe function and its related code are effectively unreachable for fuzzing. Let's double-check the negative criteria: unreachable hardware and paths. Both apply here. The hardware is physically unreachable in the intended environments, and the code path is only active under an uncommon and specific hardware configuration. I need to confirm my reasoning. This patch modifies the `igc` driver, specifically within the probe function `igc_probe()` and a new static function `igc_get_acpi_mac_passthru()`. This code executes *only* when an Intel IGC NIC is present and connected via Thunderbolt/USB4, accessing ACPI MAC passthrough buffers. Since this requires physical hardware, specifically an Intel I225/I226 connected through Thunderbolt/USB4, which is not emulated in the typical QEMU/syzkaller or GCE environments used for fuzzing, this code path is unreachable. So, I'm confident in my assessment. I need to set the fuzzing results: * `WorthFuzzing`: `false` * `FocusSymbols`: `[]` * `EnableConfigs`: `[]` * `Reasoning`: "The patch modifies the Intel 2.5G Ethernet (`igc`) driver to read ACPI MAC address passthrough for Thunderbolt/USB4-docked devices during `igc_probe()`. This code path requires physical Intel I225/I226 NIC hardware connected via Thunderbolt, which is not present or emulated in standard virtualized fuzzing environments (QEMU/GCE), making it structurally unreachable." Let's invoke `set-results`. |
| 6/2 | 2026/09/10 20:21 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies the Intel 2.5G Ethernet (igc) driver to support ACPI MAC address passthrough for Thunderbolt/USB4-attached devices during igc_probe. This code requires physical Intel I225/I226 series Ethernet hardware connected via Thunderbolt, which is not emulated or available in standard virtualized fuzzing environments (QEMU/GCE). Thus, the modified code is structurally unreachable.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Intel 2.5G Ethernet (igc) driver to support ACPI MAC address passthrough for Thunderbolt/USB4-attached devices during igc_probe. This code requires physical Intel I225/I226 series Ethernet hardware connected via Thunderbolt, which is not emulated or available in standard virtualized fuzzing environments (QEMU/GCE). Thus, the modified code is structurally unreachable.",
"WorthFuzzing": false
} |
| 7/1 | 2026/09/10 20:21 | action | If |
0mArgs:{
"WorthFuzzing": false
}Results: null |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|