| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/09/29 20:56 | flow | patch-triage |
1mArgs:null Results: {
"EnableConfigs": [
"AMT",
"IP_MULTICAST"
],
"FocusSymbols": [
"amt_parse_type",
"amt_err_lookup",
"amt_rcv"
],
"KMSANReasoning": "The patch fixes an out-of-bounds read in `amt_parse_type()` within `drivers/net/amt.c`. Previously, `pskb_may_pull()` only ensured that `sizeof(struct udphdr) + sizeof(struct amt_header)` bytes were available relative to `skb-\u003edata`. However, when processing ICMP error packets via `amt_err_lookup()`, `skb-\u003edata` points to the outer/quoted IP header, while `udp_hdr(skb)` points to the transport header offset within the skb. As a result, dereferencing `(struct amt_header *)(udp_hdr(skb) + 1)` could access bytes beyond the linear buffer length (out-of-bounds read).\n\nThe fix includes `skb_transport_offset(skb)` in `pskb_may_pull()`. This change addresses a buffer bounds check / out-of-bounds read, which is detected by KASAN. The patch does not introduce or expose uninitialized memory, does not touch uninitialized stack/heap allocations, and does not involve memory disclosures to userspace. Therefore, a dedicated KMSAN fuzzing session is not warranted.",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies amt_parse_type() in the Automatic Multicast Tunneling (AMT) driver (drivers/net/amt.c) to correctly pull skb data accounting for skb_transport_offset() when handling ICMP error packets in amt_err_lookup(). AMT is a virtual networking driver configurable via rtnl netlink and reachable via standard network sockets and virtual interfaces in virtualized environments like QEMU. Fuzzing this path can uncover out-of-bounds packet parsing and skb handling issues.",
"WorthFuzzing": true
} |
| 1/1 | 2026/09/29 20:56 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 435d3a6de0e507133de3b31693e64f7ae20d03a2\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Tue Sep 29 20:56:14 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/amt.c b/drivers/net/amt.c\nindex bddc24e1856de..0277e4cac39bd 100644\n--- a/drivers/net/amt.c\n+++ b/drivers/net/amt.c\n@@ -1310,8 +1310,12 @@ static int amt_parse_type(struct sk_buff *skb)\n {\n \tstruct amt_header *amth;\n \n-\tif (!pskb_may_pull(skb, sizeof(struct udphdr) +\n-\t\t\t sizeof(struct amt_header)))\n+\t/* skb-\u003edata is the UDP header on receive, but the quoted IP header\n+\t * when amt_err_lookup() parses an ICMP error, so pull up to the\n+\t * transport header rather than from skb-\u003edata.\n+\t */\n+\tif (!pskb_may_pull(skb, skb_transport_offset(skb) +\n+\t\t\t sizeof(struct udphdr) + sizeof(struct amt_header)))\n \t\treturn -1;\n \n \tamth = (struct amt_header *)(udp_hdr(skb) + 1);\n"
} |
| 2/1 | 2026/09/29 20:56 | agent | patch-evaluator |
0mModel:core Args: null Results: {
"EnableConfigs": [
"AMT",
"IP_MULTICAST"
],
"FocusSymbols": [
"amt_parse_type",
"amt_err_lookup",
"amt_rcv"
],
"Reasoning": "The patch modifies amt_parse_type() in the Automatic Multicast Tunneling (AMT) driver (drivers/net/amt.c) to correctly pull skb data accounting for skb_transport_offset() when handling ICMP error packets in amt_err_lookup(). AMT is a virtual networking driver configurable via rtnl netlink and reachable via standard network sockets and virtual interfaces in virtualized environments like QEMU. Fuzzing this path can uncover out-of-bounds packet parsing and skb handling issues.",
"WorthFuzzing": true
}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 435d3a6de0e507133de3b31693e64f7ae20d03a2
Author: syz-cluster <triage@syzkaller.com>
Date: Tue Sep 29 20:56:14 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/amt.c b/drivers/net/amt.c
index bddc24e1856de..0277e4cac39bd 100644
--- a/drivers/net/amt.c
+++ b/drivers/net/amt.c
@@ -1310,8 +1310,12 @@ static int amt_parse_type(struct sk_buff *skb)
{
struct amt_header *amth;
- if (!pskb_may_pull(skb, sizeof(struct udphdr) +
- sizeof(struct amt_header)))
+ /* skb->data is the UDP header on receive, but the quoted IP header
+ * when amt_err_lookup() parses an ICMP error, so pull up to the
+ * transport header rather than from skb->data.
+ */
+ if (!pskb_may_pull(skb, skb_transport_offset(skb) +
+ sizeof(struct udphdr) + sizeof(struct amt_header)))
return -1;
amth = (struct amt_header *)(udp_hdr(skb) + 1);
|
| 3/2 | 2026/09/29 20:56 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 2956 output: 61 thoughts: 129 Thoughts: Okay, here's my summary, taking the perspective of someone familiar with kernel development: **Analyzing the AMT Driver Patch** Alright, the patch is pinpointing `drivers/net/amt.c`. First, I'll quickly refresh my memory on what AMT actually *is*. Ah yes, Automatic Multicast Tunneling, defined in RFC 7450. Right, that's a virtual netdev, essentially a tunneling driver within the Linux kernel, conveniently located where I'd expect it: `drivers/net/amt.c`. Now, let's dive into that `amt.c` file. I need to understand the specifics of this driver. I'll need to check the associated Kconfig to see what configuration options enable it. That should give me a solid starting point for understanding its dependencies and build process. More importantly, I need to identify which functions are being directly affected by the patch and see what other code calls them. A quick overview of the caller functions is essential. I'll run my tool of choice - either `grepper` or `read-file`, to get a look into `drivers/net/amt.c` and its associated `Kconfig`. That will give me a clear picture of what the patch touches and how it's integrated. |
| 4/2 | 2026/09/29 20:56 | tool | grepper |
0mArgs:{
"Expression": "config AMT",
"PathPrefix": "drivers/net"
}Results: {
"Output": "drivers/net/Kconfig=289=config PFCP\n--\ndrivers/net/Kconfig-301-\ndrivers/net/Kconfig:302:config AMT\ndrivers/net/Kconfig-303-\ttristate \"Automatic Multicast Tunneling (AMT)\"\n"
} |
| 5/2 | 2026/09/29 20:56 | tool | read-file |
0mArgs:{
"File": "drivers/net/amt.c",
"FirstLine": 1300,
"LineCount": 50
}Results: {
"Contents": "1300:\t\tdev_kfree_skb(skb);\n1301:\t\treturn NETDEV_TX_OK;\n1302:\tfree:\n1303:\t\tdev_kfree_skb(skb);\n1304:\tunlock:\n1305:\t\tdev-\u003estats.tx_dropped++;\n1306:\t\treturn NETDEV_TX_OK;\n1307:\t}\n1308:\t\n1309:\tstatic int amt_parse_type(struct sk_buff *skb)\n1310:\t{\n1311:\t\tstruct amt_header *amth;\n1312:\t\n1313:\t\t/* skb-\u003edata is the UDP header on receive, but the quoted IP header\n1314:\t\t * when amt_err_lookup() parses an ICMP error, so pull up to the\n1315:\t\t * transport header rather than from skb-\u003edata.\n1316:\t\t */\n1317:\t\tif (!pskb_may_pull(skb, skb_transport_offset(skb) +\n1318:\t\t\t\t sizeof(struct udphdr) + sizeof(struct amt_header)))\n1319:\t\t\treturn -1;\n1320:\t\n1321:\t\tamth = (struct amt_header *)(udp_hdr(skb) + 1);\n1322:\t\n1323:\t\tif (amth-\u003eversion != 0)\n1324:\t\t\treturn -1;\n1325:\t\n1326:\t\tif (amth-\u003etype \u003e= __AMT_MSG_MAX || !amth-\u003etype)\n1327:\t\t\treturn -1;\n1328:\t\treturn amth-\u003etype;\n1329:\t}\n1330:\t\n1331:\tstatic void amt_clear_groups(struct amt_tunnel_list *tunnel)\n1332:\t{\n1333:\t\tstruct amt_dev *amt = tunnel-\u003eamt;\n1334:\t\tstruct amt_group_node *gnode;\n1335:\t\tstruct hlist_node *t;\n1336:\t\tint i;\n1337:\t\n1338:\t\tspin_lock_bh(\u0026tunnel-\u003elock);\n1339:\t\trcu_read_lock();\n1340:\t\tfor (i = 0; i \u003c amt-\u003ehash_buckets; i++)\n1341:\t\t\thlist_for_each_entry_safe(gnode, t, \u0026tunnel-\u003egroups[i], node)\n1342:\t\t\t\tamt_del_group(amt, gnode);\n1343:\t\trcu_read_unlock();\n1344:\t\tspin_unlock_bh(\u0026tunnel-\u003elock);\n1345:\t}\n1346:\t\n1347:\tstatic void amt_tunnel_expire(struct work_struct *work)\n1348:\t{\n1349:\t\tstruct amt_tunnel_list *tunnel = container_of(to_delayed_work(work),\n"
} |
| 6/2 | 2026/09/29 20:56 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 4263 output: 34 thoughts: 9 Thoughts: Okay, here's my attempt at summarizing those thoughts from an expert's perspective, using a first-person perspective: **Diving into Kconfig and AMT** Alright, let's see... I need to get my head around the Kconfig configurations related to AMT. It's time to delve into those options and figure out what's enabled, disabled, and what kind of customization points are available. I need to understand how these settings impact the overall functionality and integration of AMT within the system. I'll probably start by looking for the main AMT-related Kconfig files and then trace dependencies from there. This will enable me to comprehend how things are hooked together. |
| 7/2 | 2026/09/29 20:56 | tool | read-file |
0mArgs:{
"File": "drivers/net/Kconfig",
"FirstLine": 300,
"LineCount": 25
}Results: {
"Contents": " 300:\t\t will be called pfcp.\n 301:\t\n 302:\tconfig AMT\n 303:\t\ttristate \"Automatic Multicast Tunneling (AMT)\"\n 304:\t\tdepends on INET \u0026\u0026 IP_MULTICAST\n 305:\t\tselect NET_UDP_TUNNEL\n 306:\t\thelp\n 307:\t\t This allows one to create AMT(Automatic Multicast Tunneling)\n 308:\t\t virtual interfaces that provide multicast tunneling.\n 309:\t\t There are two roles, Gateway, and Relay.\n 310:\t\t Gateway Encapsulates IGMP/MLD traffic from listeners to the Relay.\n 311:\t\t Gateway Decapsulates multicast traffic from the Relay to Listeners.\n 312:\t\t Relay Encapsulates multicast traffic from Sources to Gateway.\n 313:\t\t Relay Decapsulates IGMP/MLD traffic from Gateway.\n 314:\t\n 315:\t\t To compile this drivers as a module, choose M here: the module\n 316:\t\t will be called amt.\n 317:\t\n 318:\tconfig MACSEC\n 319:\t\ttristate \"IEEE 802.1AE MAC-level encryption (MACsec)\"\n 320:\t\tselect CRYPTO\n 321:\t\tselect CRYPTO_AES\n 322:\t\tselect CRYPTO_GCM\n 323:\t\tselect GRO_CELLS\n 324:\t\thelp\n"
} |
| 8/2 | 2026/09/29 20:56 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 4830 output: 32 thoughts: 13 Thoughts: Okay, here's my attempt at summarizing that thought process, keeping in mind I'm speaking to a fellow expert: **Tracing the Usage of `amt_parse_type`** Right, let's get down to brass tacks. I need to understand the role of this `amt_parse_type` function. Not just what it *does*, but *where* it's being used and how it fits into the broader picture. So, my initial thought is straightforward: let's track down every single caller. I need a clear, concise map of the function's influence. I want to see how the calling context impacts the function's behavior and the design of the code more broadly. I need to understand this component from the ground up, so I want to start by identifying all the points of invocation. This is where the real work begins. |
| 9/2 | 2026/09/29 20:56 | tool | grepper |
0mArgs:{
"Expression": "amt_parse_type",
"PathPrefix": "drivers/net/amt.c"
}Results: {
"Output": "drivers/net/amt.c=1177=static netdev_tx_t amt_dev_xmit(struct sk_buff *skb, struct net_device *dev)\n--\ndrivers/net/amt.c-1308-\ndrivers/net/amt.c:1309:static int amt_parse_type(struct sk_buff *skb)\ndrivers/net/amt.c-1310-{\n--\ndrivers/net/amt.c=2786=static void amt_gw_rcv(struct amt_dev *amt, struct sk_buff *skb)\ndrivers/net/amt.c-2787-{\ndrivers/net/amt.c:2788:\tint type = amt_parse_type(skb);\ndrivers/net/amt.c-2789-\tint err = 1;\n--\ndrivers/net/amt.c=2818=static int amt_rcv(struct sock *sk, struct sk_buff *skb)\n--\ndrivers/net/amt.c-2836-\tsaddr = ip_hdr(skb)-\u003esaddr;\ndrivers/net/amt.c:2837:\ttype = amt_parse_type(skb);\ndrivers/net/amt.c-2838-\tif (type == -1) {\n--\ndrivers/net/amt.c=2956=static int amt_err_lookup(struct sock *sk, struct sk_buff *skb)\n--\ndrivers/net/amt.c-2968-\ndrivers/net/amt.c:2969:\ttype = amt_parse_type(skb);\ndrivers/net/amt.c-2970-\tif (type == -1)\n"
} |
| 10/2 | 2026/09/29 20:56 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 5489 output: 33 thoughts: 75 Thoughts: Here's my thought process, breaking down this code snippet: **Investigating AMT Device Management and Netlink Interaction** Okay, so I'm looking at these variables: `amt_err_lookup`, `amt_rcv`, and `amt_gw_rcv`. They immediately suggest we're dealing with AMT (Active Management Technology) and error handling, receiving data, and gateway-related functions. The question now is: can we create and fuzz these AMT devices using netlink? It's a natural direction to explore given netlink's role in network configuration and management. Aha! Remembering that AMT devices are actually implemented as `rtnl` (routing netlink) link types, specifically "amt", gives me a solid starting point. This confirms the netlink connection. Now, I need to understand how these devices are defined and managed within the kernel. The obvious next step is to examine `amt_link_ops`. This should be where the core functionality for the AMT link type resides. I'll head over to `drivers/net/amt.c` and dig into the implementation details. |
| 11/2 | 2026/09/29 20:56 | tool | grepper |
0mArgs:{
"Expression": "rtnl_link_ops",
"PathPrefix": "drivers/net/amt.c"
}Results: {
"Output": "drivers/net/amt.c=3368=static int amt_fill_info(struct sk_buff *skb, const struct net_device *dev)\n--\ndrivers/net/amt.c-3401-\ndrivers/net/amt.c:3402:static struct rtnl_link_ops amt_link_ops __read_mostly = {\ndrivers/net/amt.c-3403-\t.kind\t\t= \"amt\",\n"
} |
| 12/2 | 2026/09/29 20:56 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 5951 output: 32 thoughts: 88 Thoughts: Okay, here's my understanding, tailored for an expert audience, as if it were my own thought process: **AMT Device Internals & Error Handling - Diving In** Right, let me see... AMT, that's a virtual network device. Okay, userspace programs, particularly things like syzkaller, can create these AMT instances using netlink, specifically through the `rtnl_link_ops "amt"` interface. So far, so standard. Makes sense; you need a way to bring the device into existence. Now, how do we get data into it? Ah, injection. We've got a few options: raw sockets, the classic `tun/tap` approach, loopback, and interestingly, UDP tunnel sockets. That last one piques my interest; a virtual device that can be fed packets via a UDP tunnel opens some interesting possibilities, especially for debugging or perhaps sandboxing. But wait, what about errors? This is where it gets more interesting. I see a function called `amt_err_lookup`. Aha! That's the error handler for the UDP tunnel portion of the device's functionality. My next logical step is to pinpoint *exactly* where and how `amt_err_lookup` is actually invoked. I need to understand the error paths, and how the system responds to different UDP tunnel issues. Time to dig deeper into the call stack. |
| 13/2 | 2026/09/29 20:56 | tool | grepper |
0mArgs:{
"Expression": "amt_err_lookup",
"PathPrefix": "drivers/net/amt.c"
}Results: {
"Output": "drivers/net/amt.c=1309=static int amt_parse_type(struct sk_buff *skb)\n--\ndrivers/net/amt.c-1313-\t/* skb-\u003edata is the UDP header on receive, but the quoted IP header\ndrivers/net/amt.c:1314:\t * when amt_err_lookup() parses an ICMP error, so pull up to the\ndrivers/net/amt.c-1315-\t * transport header rather than from skb-\u003edata.\n--\ndrivers/net/amt.c=2917=static void amt_event_work(struct work_struct *work)\n--\ndrivers/net/amt.c-2955-\ndrivers/net/amt.c:2956:static int amt_err_lookup(struct sock *sk, struct sk_buff *skb)\ndrivers/net/amt.c-2957-{\n--\ndrivers/net/amt.c=3014=static int amt_socket_create(struct amt_dev *amt)\n--\ndrivers/net/amt.c-3027-\ttunnel_cfg.encap_rcv = amt_rcv;\ndrivers/net/amt.c:3028:\ttunnel_cfg.encap_err_lookup = amt_err_lookup;\ndrivers/net/amt.c-3029-\ttunnel_cfg.encap_destroy = NULL;\n"
} |
| 14/2 | 2026/09/29 20:56 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 6713 output: 28 thoughts: 418 Thoughts: **Analyzing an AMT UDP Tunnel Vulnerability** Okay, let's dissect this. I see a potential issue arising from how we handle ICMP error packets in the AMT UDP tunnel. Specifically, I need to focus on `amt_rcv` and `amt_err_lookup`, and how these functions interact. The crucial bit here is in `amt_err_lookup`: when an ICMP error arrives, `skb->data` points to the quoted IP header within the error packet. The core problem, as I understand it, stems from an earlier version's attempt to parse the UDP and AMT headers. The original `amt_parse_type` function used `pskb_may_pull` to ensure sufficient data was available: `pskb_may_pull(skb, sizeof(struct udphdr) + sizeof(struct amt_header))` and then it tried to get the AMT header relative to the UDP header: `amth = (struct amt_header *)(udp_hdr(skb) + 1);` The difficulty, and the source of the potential OOB, arises because the initial assumption may be flawed. If the incoming data's `skb->data` doesn't *start* at the UDP header (rather it's `skb_transport_offset(skb)` bytes away), `pskb_may_pull` only guarantees a certain byte count is available from *that point* onwards. Accessing `udp_hdr(skb) + 1` could then easily overstep the pulled buffer if `skb_transport_offset` isn't factored in. Alternatively, the data might actually start at the UDP header which is 0 offset, this still causes the above issue. The patch corrects this with: `pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct udphdr) + sizeof(struct amt_header))` This now ensures the check properly considers the actual offset of the UDP header. This fixes the out-of-bounds read or potential buffer overflow when ICMP error packets are processed by the AMT UDP tunnel. This is critical because this code path is definitely reachable within the network subsystem (`drivers/net/amt.c`). It's part of the AMT implementation, which is essentially a virtual tunnel device—a software-defined network device. I'd expect this could be easily reproduced in a standard QEMU environment, as it's a software-based virtual netdev. From a configuration perspective, I know AMT is controlled by the `AMT` config option, which is a tristate. It depends on `INET` and `IP_MULTICAST`. Thus, I should verify the `IP_MULTICAST` setting in the Kconfig as well, to ensure its implications are fully understood. |
| 15/2 | 2026/09/29 20:56 | tool | grepper |
0mArgs:{
"Expression": "config IP_MULTICAST",
"PathPrefix": "net/"
}Results: {
"Output": "net/ipv4/Kconfig-4-#\nnet/ipv4/Kconfig:5:config IP_MULTICAST\nnet/ipv4/Kconfig-6-\tbool \"IP: multicasting\"\n"
} |
| 16/2 | 2026/09/29 20:56 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 7819 output: 171 thoughts: 530 Thoughts: **AMT Driver Analysis for Fuzzing**
Okay, let's break this down. First, I need to confirm whether `amt_parse_type` in `drivers/net/amt.c` is static and possibly inlined. It's called from `amt_gw_rcv`, `amt_rcv`, and `amt_err_lookup` within the same file, so it's a candidate for inlining. I'm going to focus on those three functions plus `amt_parse_type` itself to be thorough. I'll need to double check that `amt_parse_type` is non-ubiquitous, and it looks like it is, confined to the AMT driver.
Next, the configuration requirements. `AMT` depends on `INET` and `IP_MULTICAST`. `INET` is pretty standard, but `AMT` and `IP_MULTICAST` are the crucial ones to ensure are enabled for syzkaller. Let me quickly verify that `NET_UDP_TUNNEL` is selected when `AMT` is enabled - Yep, it is.
Now, let's make sure it satisfies the prompt guidelines. "REACHABILITY IS THE PRIMARY GATE" - AMT is definitely reachable. It's a virtual network device driver, configurable through rtnl netlink ("amt") and accessible via sockets, tun/tap interfaces within QEMU. "WHEN TO RETURN WorthFuzzing=true" - check. It's accessible via sockets and netlink. This means I can confidently set WorthFuzzing to true!
My `FocusSymbols` are clearly: `amt_parse_type`, `amt_err_lookup`, and `amt_rcv`. My `EnableConfigs` are `AMT` and `IP_MULTICAST`.
Excellent, all checks are positive. I'm ready to call `set-results`.
|
| 17/2 | 2026/09/29 20:57 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"AMT",
"IP_MULTICAST"
],
"FocusSymbols": [
"amt_parse_type",
"amt_err_lookup",
"amt_rcv"
],
"Reasoning": "The patch modifies amt_parse_type() in the Automatic Multicast Tunneling (AMT) driver (drivers/net/amt.c) to correctly pull skb data accounting for skb_transport_offset() when handling ICMP error packets in amt_err_lookup(). AMT is a virtual networking driver configurable via rtnl netlink and reachable via standard network sockets and virtual interfaces in virtualized environments like QEMU. Fuzzing this path can uncover out-of-bounds packet parsing and skb handling issues.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"AMT",
"IP_MULTICAST"
],
"FocusSymbols": [
"amt_parse_type",
"amt_err_lookup",
"amt_rcv"
],
"Reasoning": "The patch modifies amt_parse_type() in the Automatic Multicast Tunneling (AMT) driver (drivers/net/amt.c) to correctly pull skb data accounting for skb_transport_offset() when handling ICMP error packets in amt_err_lookup(). AMT is a virtual networking driver configurable via rtnl netlink and reachable via standard network sockets and virtual interfaces in virtualized environments like QEMU. Fuzzing this path can uncover out-of-bounds packet parsing and skb handling issues.",
"WorthFuzzing": true
} |
| 18/1 | 2026/09/29 20:57 | action | If |
0mArgs:{
"WorthFuzzing": true
}Results: null |
| 19/2 | 2026/09/29 20:57 | agent | kmsan-evaluator |
0mModel:core Args: null Results: {
"KMSANReasoning": "The patch fixes an out-of-bounds read in `amt_parse_type()` within `drivers/net/amt.c`. Previously, `pskb_may_pull()` only ensured that `sizeof(struct udphdr) + sizeof(struct amt_header)` bytes were available relative to `skb-\u003edata`. However, when processing ICMP error packets via `amt_err_lookup()`, `skb-\u003edata` points to the outer/quoted IP header, while `udp_hdr(skb)` points to the transport header offset within the skb. As a result, dereferencing `(struct amt_header *)(udp_hdr(skb) + 1)` could access bytes beyond the linear buffer length (out-of-bounds read).\n\nThe fix includes `skb_transport_offset(skb)` in `pskb_may_pull()`. This change addresses a buffer bounds check / out-of-bounds read, which is detected by KASAN. The patch does not introduce or expose uninitialized memory, does not touch uninitialized stack/heap allocations, and does not involve memory disclosures to userspace. Therefore, a dedicated KMSAN fuzzing session is not warranted.",
"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: Target architecture: amd64
For your convenience, here is the diff of the changes:
commit 435d3a6de0e507133de3b31693e64f7ae20d03a2
Author: syz-cluster <triage@syzkaller.com>
Date: Tue Sep 29 20:56:14 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/amt.c b/drivers/net/amt.c
index bddc24e1856de..0277e4cac39bd 100644
--- a/drivers/net/amt.c
+++ b/drivers/net/amt.c
@@ -1310,8 +1310,12 @@ static int amt_parse_type(struct sk_buff *skb)
{
struct amt_header *amth;
- if (!pskb_may_pull(skb, sizeof(struct udphdr) +
- sizeof(struct amt_header)))
+ /* skb->data is the UDP header on receive, but the quoted IP header
+ * when amt_err_lookup() parses an ICMP error, so pull up to the
+ * transport header rather than from skb->data.
+ */
+ if (!pskb_may_pull(skb, skb_transport_offset(skb) +
+ sizeof(struct udphdr) + sizeof(struct amt_header)))
return -1;
amth = (struct amt_header *)(udp_hdr(skb) + 1);
|
| 20/3 | 2026/09/29 20:57 | llm | kmsan-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 2168 output: 36 thoughts: 364 Thoughts: **KMSAN Fuzzing Session Evaluation** Okay, so I need to decide if this patch warrants its own KMSAN fuzzing session. Let's dig in. I see a `diff` that's updating `drivers/net/amt.c`. Right away, the change jumps out - it appears to be adjusting how the code determines the amount of data it can safely `pull` from an `skb`. Specifically, it looks like there's an issue where the calculation wasn't taking into account whether the `skb` contains a UDP header or an ICMP error (which has a quoted IP header as well) in its `amt_parse_type` function. It is updating the logic to account for that variance. The original check, based on `skb->data`, has been replaced by one that uses `skb_transport_offset(skb)` to avoid potential issues. This *could* be a memory safety bug fix, or simply improving robustness against malformed packets. The use of `pskb_may_pull` itself immediately catches my attention - it is a common area for exploitable bugs. I'm going to want to take a closer look. I'll need to understand the context a bit better. Time to pull up `drivers/net/amt.c` around line 1310 to check the surrounding code and callers. I'll use my tools - likely `read-file` or `grepper` - to get a feel for how `amt_parse_type` is actually used and what data it processes. I’m thinking I will need to look at what `amt_err_lookup()` does to understand the ICMP error handling. I'll see if there's any obvious vulnerability. Based on that information, I'll assess whether a dedicated KMSAN session is justified. Given the potential for off-by-one errors and information leaks in this area of the networking stack, I'm leaning towards yes - a fuzzing session might be beneficial to validate the change and catch anything else that could be related to these memory access problems. |
| 21/3 | 2026/09/29 20:57 | tool | read-file |
0mArgs:{
"File": "drivers/net/amt.c",
"FirstLine": 1300,
"LineCount": 50
}Results: {
"Contents": "1300:\t\tdev_kfree_skb(skb);\n1301:\t\treturn NETDEV_TX_OK;\n1302:\tfree:\n1303:\t\tdev_kfree_skb(skb);\n1304:\tunlock:\n1305:\t\tdev-\u003estats.tx_dropped++;\n1306:\t\treturn NETDEV_TX_OK;\n1307:\t}\n1308:\t\n1309:\tstatic int amt_parse_type(struct sk_buff *skb)\n1310:\t{\n1311:\t\tstruct amt_header *amth;\n1312:\t\n1313:\t\t/* skb-\u003edata is the UDP header on receive, but the quoted IP header\n1314:\t\t * when amt_err_lookup() parses an ICMP error, so pull up to the\n1315:\t\t * transport header rather than from skb-\u003edata.\n1316:\t\t */\n1317:\t\tif (!pskb_may_pull(skb, skb_transport_offset(skb) +\n1318:\t\t\t\t sizeof(struct udphdr) + sizeof(struct amt_header)))\n1319:\t\t\treturn -1;\n1320:\t\n1321:\t\tamth = (struct amt_header *)(udp_hdr(skb) + 1);\n1322:\t\n1323:\t\tif (amth-\u003eversion != 0)\n1324:\t\t\treturn -1;\n1325:\t\n1326:\t\tif (amth-\u003etype \u003e= __AMT_MSG_MAX || !amth-\u003etype)\n1327:\t\t\treturn -1;\n1328:\t\treturn amth-\u003etype;\n1329:\t}\n1330:\t\n1331:\tstatic void amt_clear_groups(struct amt_tunnel_list *tunnel)\n1332:\t{\n1333:\t\tstruct amt_dev *amt = tunnel-\u003eamt;\n1334:\t\tstruct amt_group_node *gnode;\n1335:\t\tstruct hlist_node *t;\n1336:\t\tint i;\n1337:\t\n1338:\t\tspin_lock_bh(\u0026tunnel-\u003elock);\n1339:\t\trcu_read_lock();\n1340:\t\tfor (i = 0; i \u003c amt-\u003ehash_buckets; i++)\n1341:\t\t\thlist_for_each_entry_safe(gnode, t, \u0026tunnel-\u003egroups[i], node)\n1342:\t\t\t\tamt_del_group(amt, gnode);\n1343:\t\trcu_read_unlock();\n1344:\t\tspin_unlock_bh(\u0026tunnel-\u003elock);\n1345:\t}\n1346:\t\n1347:\tstatic void amt_tunnel_expire(struct work_struct *work)\n1348:\t{\n1349:\t\tstruct amt_tunnel_list *tunnel = container_of(to_delayed_work(work),\n"
} |
| 22/3 | 2026/09/29 20:57 | llm | kmsan-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 3781 output: 19 thoughts: 15 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience: **Analyzing the Call Sites of `amt_parse_type`** Right, let's dive into this. I need to understand the implications of `amt_parse_type`. The most immediate thing to do is figure out *where* it's being used. Understanding the call sites is key. I'm going to start by tracing the function's usage, looking for all instances of its invocation within the codebase. The context of those calls will reveal the role `amt_parse_type` plays in the broader system and expose the assumptions built into its design. Is it called from a handful of central locations, or is it scattered throughout? The distribution pattern will tell me a lot. This approach allows me to quickly establish the potential impact of changes to the function. |
| 23/3 | 2026/09/29 20:57 | tool | grepper |
0mArgs:{
"Expression": "amt_parse_type"
}Results: {
"Output": "drivers/net/amt.c=1177=static netdev_tx_t amt_dev_xmit(struct sk_buff *skb, struct net_device *dev)\n--\ndrivers/net/amt.c-1308-\ndrivers/net/amt.c:1309:static int amt_parse_type(struct sk_buff *skb)\ndrivers/net/amt.c-1310-{\n--\ndrivers/net/amt.c=2786=static void amt_gw_rcv(struct amt_dev *amt, struct sk_buff *skb)\ndrivers/net/amt.c-2787-{\ndrivers/net/amt.c:2788:\tint type = amt_parse_type(skb);\ndrivers/net/amt.c-2789-\tint err = 1;\n--\ndrivers/net/amt.c=2818=static int amt_rcv(struct sock *sk, struct sk_buff *skb)\n--\ndrivers/net/amt.c-2836-\tsaddr = ip_hdr(skb)-\u003esaddr;\ndrivers/net/amt.c:2837:\ttype = amt_parse_type(skb);\ndrivers/net/amt.c-2838-\tif (type == -1) {\n--\ndrivers/net/amt.c=2956=static int amt_err_lookup(struct sock *sk, struct sk_buff *skb)\n--\ndrivers/net/amt.c-2968-\ndrivers/net/amt.c:2969:\ttype = amt_parse_type(skb);\ndrivers/net/amt.c-2970-\tif (type == -1)\n"
} |
| 24/3 | 2026/09/29 20:57 | llm | kmsan-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 4426 output: 36 thoughts: 22 Thoughts: Here's a summary of my thinking process, focusing on the provided text, assuming I'm already well-versed in the code: **Diving into `amt_err_lookup`** Okay, so I'm zeroing in on `amt_err_lookup` and its surrounding code, specifically around line 2956. This suggests there's a potential issue or area of interest related to error handling within this particular function or in the way it's being used. I need to understand what this lookup is doing and, more importantly, how it's being *called*. Line 2956 is the key to figuring out the specific context and hopefully, the nature of the problem, or at the very least, understand the flow around the lookup. I'll need to trace the calls. |
| 25/3 | 2026/09/29 20:57 | tool | read-file |
0mArgs:{
"File": "drivers/net/amt.c",
"FirstLine": 2950,
"LineCount": 50
}Results: {
"Contents": "2950:\t\t\t\tkfree_skb(skb);\n2951:\t\t\t\tbreak;\n2952:\t\t\t}\n2953:\t\t}\n2954:\t}\n2955:\t\n2956:\tstatic int amt_err_lookup(struct sock *sk, struct sk_buff *skb)\n2957:\t{\n2958:\t\tstruct amt_dev *amt;\n2959:\t\tint type;\n2960:\t\n2961:\t\trcu_read_lock_bh();\n2962:\t\tamt = rcu_dereference_sk_user_data(sk);\n2963:\t\tif (!amt)\n2964:\t\t\tgoto out;\n2965:\t\n2966:\t\tif (amt-\u003emode != AMT_MODE_GATEWAY)\n2967:\t\t\tgoto drop;\n2968:\t\n2969:\t\ttype = amt_parse_type(skb);\n2970:\t\tif (type == -1)\n2971:\t\t\tgoto drop;\n2972:\t\n2973:\t\tnetdev_dbg(amt-\u003edev, \"Received IGMP Unreachable of %s\\n\",\n2974:\t\t\t type_str[type]);\n2975:\t\tswitch (type) {\n2976:\t\tcase AMT_MSG_DISCOVERY:\n2977:\t\t\tbreak;\n2978:\t\tcase AMT_MSG_REQUEST:\n2979:\t\tcase AMT_MSG_MEMBERSHIP_UPDATE:\n2980:\t\t\tif (READ_ONCE(amt-\u003estatus) \u003e= AMT_STATUS_RECEIVED_ADVERTISEMENT)\n2981:\t\t\t\tmod_delayed_work(amt_wq, \u0026amt-\u003ereq_wq, 0);\n2982:\t\t\tbreak;\n2983:\t\tdefault:\n2984:\t\t\tgoto drop;\n2985:\t\t}\n2986:\tout:\n2987:\t\trcu_read_unlock_bh();\n2988:\t\treturn 0;\n2989:\tdrop:\n2990:\t\trcu_read_unlock_bh();\n2991:\t\tamt-\u003edev-\u003estats.rx_dropped++;\n2992:\t\treturn 0;\n2993:\t}\n2994:\t\n2995:\tstatic struct sock *amt_create_sock(struct net *net, __be16 port)\n2996:\t{\n2997:\t\tstruct udp_port_cfg udp_conf;\n2998:\t\tstruct socket *sock;\n2999:\t\tint err;\n"
} |
| 26/3 | 2026/09/29 20:57 | llm | kmsan-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 5325 output: 278 thoughts: 1266 Thoughts: **Analysis of AMT Header Parsing and Memory Safety** Okay, let's break this down. The core issue revolves around how the code handles AMT headers, specifically within `amt_parse_type`. Previously, a `pskb_may_pull` call was being used to ensure sufficient bytes were available in the SKB's linear data buffer. However, the calculation of the required length was flawed. The original check was only verifying the linear buffer's size for the UDP header and the AMT header, but the code was dereferencing data *past* the UDP header, at `udp_hdr(skb) + 1`, which translates to an offset that could go out of bounds depending on the offset of the transport header within the packet. This means that if an ICMP error packet quoted a UDP packet whose UDP and AMT headers were truncated and didn't fit into the linear buffer, there was an out-of-bounds read. This patch fixes this by correctly accounting for the offset of the transport header and checking if enough data exists for the UDP header *plus* AMT header, and all bytes being accessed at an offset from that transport header. The new check uses `skb_transport_offset(skb)` to calculate the correct length for `pskb_may_pull`. On the receive path, this offset is always zero. This guarantees that the read remains within bounds. This has to be a KASAN bug, as it involves accessing memory beyond the bounds of the SKB's linear buffer, regardless of whether it resides in the linear buffer or in page fragments. The immediate question is whether this change introduces or exposes any potential for uninitialized memory usage. I'm going to look at the relevant criteria for KMSAN vs. KASAN: * **Does it introduce or modify kernel structures sent to userspace?** No. * **Does it introduce conditional logic or branching that depends on potentially uninitialized variables?** No, because `skb_transport_offset(skb)` is simply the difference between two pointers: `skb->transport_header` and `skb->data`, which are initialized fields of the `sk_buff` struct. * **Does it allocate or initialize complex data structures where uninitialized fields could be read?** No. * **Does it alter bounds checks/lengths in a way that allows surrounding code to access uninitialized bytes of existing buffers?** No, because `pskb_may_pull` pulls bytes from the network packet buffer, and that data contains *received packet data*, which is already initialized and populated by the network stack / NIC / socket buffer. The old bug was an out-of-bounds read caused by insufficient length checks, and the fix ensures enough data is available *before* the access occurs. It's a classic KASAN situation, not KMSAN. The `pskb_may_pull` operation itself operates on network packet data, which is initialized data. The prior bug was an out-of-bounds read *past* the end of the linear buffer, an OOB read. I've double-checked that `skb_transport_header` is never used uninitialized. The `skb_transport_offset` calculation is robust due to network rx/icmp handling. Therefore, this patch fixes an out-of-bounds read in network packet processing, which is a KASAN issue, and there are *no* issues with reading uninitialized memory. `NeedsKMSAN=false` is the correct result. I can now be confident and `set-results`. |
| 27/3 | 2026/09/29 20:57 | tool | set-results |
0mArgs:{
"KMSANReasoning": "The patch fixes an out-of-bounds read in `amt_parse_type()` within `drivers/net/amt.c`. Previously, `pskb_may_pull()` only ensured that `sizeof(struct udphdr) + sizeof(struct amt_header)` bytes were available relative to `skb-\u003edata`. However, when processing ICMP error packets via `amt_err_lookup()`, `skb-\u003edata` points to the outer/quoted IP header, while `udp_hdr(skb)` points to the transport header offset within the skb. As a result, dereferencing `(struct amt_header *)(udp_hdr(skb) + 1)` could access bytes beyond the linear buffer length (out-of-bounds read).\n\nThe fix includes `skb_transport_offset(skb)` in `pskb_may_pull()`. This change addresses a buffer bounds check / out-of-bounds read, which is detected by KASAN. The patch does not introduce or expose uninitialized memory, does not touch uninitialized stack/heap allocations, and does not involve memory disclosures to userspace. Therefore, a dedicated KMSAN fuzzing session is not warranted.",
"NeedsKMSAN": false
}Results: {
"KMSANReasoning": "The patch fixes an out-of-bounds read in `amt_parse_type()` within `drivers/net/amt.c`. Previously, `pskb_may_pull()` only ensured that `sizeof(struct udphdr) + sizeof(struct amt_header)` bytes were available relative to `skb-\u003edata`. However, when processing ICMP error packets via `amt_err_lookup()`, `skb-\u003edata` points to the outer/quoted IP header, while `udp_hdr(skb)` points to the transport header offset within the skb. As a result, dereferencing `(struct amt_header *)(udp_hdr(skb) + 1)` could access bytes beyond the linear buffer length (out-of-bounds read).\n\nThe fix includes `skb_transport_offset(skb)` in `pskb_may_pull()`. This change addresses a buffer bounds check / out-of-bounds read, which is detected by KASAN. The patch does not introduce or expose uninitialized memory, does not touch uninitialized stack/heap allocations, and does not involve memory disclosures to userspace. Therefore, a dedicated KMSAN fuzzing session is not warranted.",
"NeedsKMSAN": false
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|