| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/07/11 13:09 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": [
"TIPC"
],
"FocusSymbols": [
"tipc_node_create",
"tipc_node_delete_from_list"
],
"Reasoning": "The patch introduces a hard limit on the number of TIPC nodes per net namespace to prevent unbounded memory growth. It modifies tipc_node_create to enforce this limit and updates the node count during creation and deletion. This is a functional change in core TIPC logic.",
"WorthFuzzing": true
} |
| 1/1 | 2026/07/11 13:09 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit ce823f3cea33febe8bdec821e6dc1c7bbf4b7d8d\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Sat Jul 11 13:09:18 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/net/tipc/node.c b/net/tipc/node.c\nindex 8e4ef2630ae4ff..bb41f3231ce1bb 100644\n--- a/net/tipc/node.c\n+++ b/net/tipc/node.c\n@@ -49,6 +49,16 @@\n #define INVALID_NODE_SIG\t0x10000\n #define NODE_CLEANUP_AFTER\t300000\n \n+/* Hard cap on the number of live struct tipc_node entries a single net\n+ * namespace will hold. Every entry (preliminary or not) also pins a\n+ * broadcast-receive link, a unicast link slot and a keepalive timer, so\n+ * this bounds worst-case memory from unauthenticated LINK_CONFIG discovery\n+ * traffic the same way neigh_alloc()'s gc_thresh3 bounds the ARP/ND table\n+ * (see net/core/neighbour.c). 8192 is far above any realistic TIPC cluster\n+ * size and is not meant to be tight -- it only stops unbounded growth.\n+ */\n+#define TIPC_MAX_NODES\t\t8192\n+\n /* Flags used to take different actions according to flag type\n * TIPC_NOTIFY_NODE_DOWN: notify node is down\n * TIPC_NOTIFY_NODE_UP: notify node is up\n@@ -535,6 +545,11 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id,\n \n \t\tgoto exit;\n \t}\n+\tif (tn-\u003enum_nodes \u003e= TIPC_MAX_NODES) {\n+\t\tpr_warn_ratelimited(\"Too many TIPC nodes (%u), dropping new peer %x\\n\",\n+\t\t\t\t tn-\u003enum_nodes, addr);\n+\t\tgoto exit;\n+\t}\n \tn = kzalloc_obj(*n, GFP_ATOMIC);\n \tif (!n) {\n \t\tpr_warn(\"Node creation failed, no memory\\n\");\n@@ -598,6 +613,7 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id,\n \t\t\tbreak;\n \t}\n \tlist_add_tail_rcu(\u0026n-\u003elist, \u0026temp_node-\u003elist);\n+\ttn-\u003enum_nodes++;\n \t/* Calculate cluster capabilities */\n \ttn-\u003ecapabilities = TIPC_NODE_CAPABILITIES;\n \tlist_for_each_entry_rcu(temp_node, \u0026tn-\u003enode_list, list) {\n@@ -630,6 +646,7 @@ static void tipc_node_delete_from_list(struct tipc_node *node)\n #endif\n \tlist_del_rcu(\u0026node-\u003elist);\n \thlist_del_rcu(\u0026node-\u003ehash);\n+\ttipc_net(node-\u003enet)-\u003enum_nodes--;\n \ttipc_node_put(node);\n }\n \n"
} |
| 2/1 | 2026/07/11 13:09 | agent | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: {
"EnableConfigs": [
"TIPC"
],
"FocusSymbols": [
"tipc_node_create",
"tipc_node_delete_from_list"
],
"Reasoning": "The patch introduces a hard limit on the number of TIPC nodes per net namespace to prevent unbounded memory growth. It modifies tipc_node_create to enforce this limit and updates the node count during creation and deletion. This is a functional change in core TIPC logic.",
"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). 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. 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. Do not list too generic configs (we already have them enabled). Only list those that specifically cover the modified code. 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 ce823f3cea33febe8bdec821e6dc1c7bbf4b7d8d
Author: syz-cluster <triage@syzkaller.com>
Date: Sat Jul 11 13:09:18 2026 +0000
syz-cluster: applied patch under review
diff --git a/net/tipc/node.c b/net/tipc/node.c
index 8e4ef2630ae4ff..bb41f3231ce1bb 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -49,6 +49,16 @@
#define INVALID_NODE_SIG 0x10000
#define NODE_CLEANUP_AFTER 300000
+/* Hard cap on the number of live struct tipc_node entries a single net
+ * namespace will hold. Every entry (preliminary or not) also pins a
+ * broadcast-receive link, a unicast link slot and a keepalive timer, so
+ * this bounds worst-case memory from unauthenticated LINK_CONFIG discovery
+ * traffic the same way neigh_alloc()'s gc_thresh3 bounds the ARP/ND table
+ * (see net/core/neighbour.c). 8192 is far above any realistic TIPC cluster
+ * size and is not meant to be tight -- it only stops unbounded growth.
+ */
+#define TIPC_MAX_NODES 8192
+
/* Flags used to take different actions according to flag type
* TIPC_NOTIFY_NODE_DOWN: notify node is down
* TIPC_NOTIFY_NODE_UP: notify node is up
@@ -535,6 +545,11 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id,
goto exit;
}
+ if (tn->num_nodes >= TIPC_MAX_NODES) {
+ pr_warn_ratelimited("Too many TIPC nodes (%u), dropping new peer %x\n",
+ tn->num_nodes, addr);
+ goto exit;
+ }
n = kzalloc_obj(*n, GFP_ATOMIC);
if (!n) {
pr_warn("Node creation failed, no memory\n");
@@ -598,6 +613,7 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id,
break;
}
list_add_tail_rcu(&n->list, &temp_node->list);
+ tn->num_nodes++;
/* Calculate cluster capabilities */
tn->capabilities = TIPC_NODE_CAPABILITIES;
list_for_each_entry_rcu(temp_node, &tn->node_list, list) {
@@ -630,6 +646,7 @@ static void tipc_node_delete_from_list(struct tipc_node *node)
#endif
list_del_rcu(&node->list);
hlist_del_rcu(&node->hash);
+ tipc_net(node->net)->num_nodes--;
tipc_node_put(node);
}
|
| 3/2 | 2026/07/11 13:09 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2359 output: 28 thoughts: 192 Thoughts: **Analyzing the TIPC Node Limit Patch** Okay, so we've got a patch here that's putting a hard cap on the number of TIPC nodes within a network namespace. It looks like the limit is defined as `TIPC_MAX_NODES`, set to 8192, which seems reasonable. The core of this patch seems to be in `tipc_node_create` where it checks if the current number of nodes, represented by `tn->num_nodes`, has hit that limit. If so, the patch's logic drops the new peer. Makes sense – prevent resource exhaustion. And, of course, they’ve added logic to increment `tn->num_nodes` when a node joins the party, and decrement it when one leaves. Standard accounting. Now, I need to figure out exactly how `tn->num_nodes` is being managed. My first thought is to dive into `net/tipc/node.c` and likely `net/tipc/node.h` or maybe even `net/tipc/core.h` to see how it's defined and where it lives. Ah, right, `tn` is a `struct tipc_net *`, so it's a field within that structure. Let's do a quick `grep` for `num_nodes` and trace its usage to confirm my assumptions and get the precise picture. That'll tell me if there's anything else interesting going on related to that counter. Good, thorough. |
| 4/2 | 2026/07/11 13:09 | tool | grepper |
0mArgs:{
"Expression": "num_nodes",
"PathPrefix": "net/tipc/"
}Results: {
"Output": "net/tipc/core.h=94=struct tipc_net {\n--\nnet/tipc/core.h-107-\tstruct list_head node_list;\nnet/tipc/core.h:108:\tu32 num_nodes;\nnet/tipc/core.h-109-\tu32 num_links;\n--\nnet/tipc/discover.c-55- * @domain: network domain to which links can be established\nnet/tipc/discover.c:56: * @num_nodes: number of nodes currently discovered (i.e. with an active link)\nnet/tipc/discover.c-57- * @lock: spinlock for controlling access to requests\n--\nnet/tipc/discover.c=63=struct tipc_discoverer {\n--\nnet/tipc/discover.c-67-\tu32 domain;\nnet/tipc/discover.c:68:\tint num_nodes;\nnet/tipc/discover.c-69-\tspinlock_t lock;\n--\nnet/tipc/discover.c=265=void tipc_disc_add_dest(struct tipc_discoverer *d)\n--\nnet/tipc/discover.c-267-\tspin_lock_bh(\u0026d-\u003elock);\nnet/tipc/discover.c:268:\td-\u003enum_nodes++;\nnet/tipc/discover.c-269-\tspin_unlock_bh(\u0026d-\u003elock);\n--\nnet/tipc/discover.c=274=void tipc_disc_remove_dest(struct tipc_discoverer *d)\n--\nnet/tipc/discover.c-278-\tspin_lock_bh(\u0026d-\u003elock);\nnet/tipc/discover.c:279:\td-\u003enum_nodes--;\nnet/tipc/discover.c:280:\tnum = d-\u003enum_nodes;\nnet/tipc/discover.c-281-\tintv = d-\u003etimer_intv;\n--\nnet/tipc/discover.c=295=static void tipc_disc_timeout(struct timer_list *t)\n--\nnet/tipc/discover.c-306-\t/* Stop searching if only desired node has been found */\nnet/tipc/discover.c:307:\tif (tipc_node(d-\u003edomain) \u0026\u0026 d-\u003enum_nodes) {\nnet/tipc/discover.c-308-\t\td-\u003etimer_intv = TIPC_DISC_INACTIVE;\n--\nnet/tipc/discover.c-324-\t\td-\u003etimer_intv *= 2;\nnet/tipc/discover.c:325:\t\tif (d-\u003enum_nodes \u0026\u0026 d-\u003etimer_intv \u003e TIPC_DISC_SLOW)\nnet/tipc/discover.c-326-\t\t\td-\u003etimer_intv = TIPC_DISC_SLOW;\nnet/tipc/discover.c:327:\t\telse if (!d-\u003enum_nodes \u0026\u0026 d-\u003etimer_intv \u003e TIPC_DISC_FAST)\nnet/tipc/discover.c-328-\t\t\td-\u003etimer_intv = TIPC_DISC_FAST;\n--\nnet/tipc/discover.c=352=int tipc_disc_create(struct net *net, struct tipc_bearer *b,\n--\nnet/tipc/discover.c-376-\td-\u003edomain = b-\u003edomain;\nnet/tipc/discover.c:377:\td-\u003enum_nodes = 0;\nnet/tipc/discover.c-378-\td-\u003etimer_intv = TIPC_DISC_INIT;\n--\nnet/tipc/discover.c=411=void tipc_disc_reset(struct net *net, struct tipc_bearer *b)\n--\nnet/tipc/discover.c-421-\td-\u003edomain = b-\u003edomain;\nnet/tipc/discover.c:422:\td-\u003enum_nodes = 0;\nnet/tipc/discover.c-423-\td-\u003etimer_intv = TIPC_DISC_INIT;\n--\nnet/tipc/node.c=478=struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id,\n--\nnet/tipc/node.c-547-\t}\nnet/tipc/node.c:548:\tif (tn-\u003enum_nodes \u003e= TIPC_MAX_NODES) {\nnet/tipc/node.c-549-\t\tpr_warn_ratelimited(\"Too many TIPC nodes (%u), dropping new peer %x\\n\",\nnet/tipc/node.c:550:\t\t\t\t tn-\u003enum_nodes, addr);\nnet/tipc/node.c-551-\t\tgoto exit;\n--\nnet/tipc/node.c-615-\tlist_add_tail_rcu(\u0026n-\u003elist, \u0026temp_node-\u003elist);\nnet/tipc/node.c:616:\ttn-\u003enum_nodes++;\nnet/tipc/node.c-617-\t/* Calculate cluster capabilities */\n--\nnet/tipc/node.c=642=static void tipc_node_delete_from_list(struct tipc_node *node)\n--\nnet/tipc/node.c-648-\thlist_del_rcu(\u0026node-\u003ehash);\nnet/tipc/node.c:649:\ttipc_net(node-\u003enet)-\u003enum_nodes--;\nnet/tipc/node.c-650-\ttipc_node_put(node);\n"
} |
| 5/2 | 2026/07/11 13:09 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4298 output: 28 thoughts: 363 Thoughts: **Fuzzing This TIPC Node Limit?** Okay, so this patch introduces a limit on the number of TIPC nodes. My initial thought is, "Is this fuzzable?" It's a functional change, but it's fundamentally just preventing the creation of more than 8192 nodes. Creating that many nodes to fuzz this... that's a lot of overhead. There's no complex logic here, it's a simple counter, an increment, a decrement, and a check. If `tn->num_nodes` is managed properly, it's *just* a limit. But, wait... it *does* alter the core TIPC logic, so I have to consider it for fuzzing. Let me re-read the guidelines. Aha! The instructions say to return `WorthFuzzing=false` if it’s just documentation, decoration, or constant/macro changes that don't alter execution flow. This *does* alter the execution flow, as it drops the node creation if the limit is reached. So, `WorthFuzzing=true`. Therefore, I think the `FocusSymbols` should be `tipc_node_create` and `tipc_node_delete_from_list`, since those are the code paths that trigger the counter. Now I have to make sure `TIPC` is the correct enable config. I'll double-check that to ensure it enables the core TIPC functionality. |
| 6/2 | 2026/07/11 13:09 | tool | grepper |
0mArgs:{
"Expression": "config TIPC",
"PathPrefix": "net/tipc/"
}Results: {
"Output": "net/tipc/Kconfig-5-\nnet/tipc/Kconfig:6:menuconfig TIPC\nnet/tipc/Kconfig-7-\ttristate \"The TIPC Protocol\"\n--\nnet/tipc/Kconfig-23-\nnet/tipc/Kconfig:24:config TIPC_MEDIA_IB\nnet/tipc/Kconfig-25-\tbool \"InfiniBand media type support\"\n--\nnet/tipc/Kconfig-29-\t IP-over-InfiniBand devices.\nnet/tipc/Kconfig:30:config TIPC_MEDIA_UDP\nnet/tipc/Kconfig-31-\tbool \"IP/UDP media type support\"\n--\nnet/tipc/Kconfig-37-\nnet/tipc/Kconfig:38:config TIPC_CRYPTO\nnet/tipc/Kconfig-39-\tbool \"TIPC encryption support\"\n--\nnet/tipc/Kconfig-52-\nnet/tipc/Kconfig:53:config TIPC_DIAG\nnet/tipc/Kconfig-54-\ttristate \"TIPC: socket monitoring interface\"\n"
} |
| 7/2 | 2026/07/11 13:09 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 5285 output: 31 thoughts: 477 Thoughts: **Fuzzing TIPC Node Management** Okay, let's break this down. The config in question is `TIPC`. I need to identify if this change warrants fuzzing and, if so, what to focus on. First, I see that `tipc_node_create` is the primary function to consider. It's called during new node discovery, which makes it a good candidate. It looks like `tipc_node_delete_from_list` is static, but we can still list it. The fact that it's a functional change makes fuzzing worthwhile. I should double-check for other related configs, but `TIPC` seems to be the main one. I'll make sure to verify `tipc_node_delete_from_list` is indeed static, and that it is okay to list a static function. Now, let me refresh the requirements. Right, I need to list specific kernel functions for heavy fuzzing in `FocusSymbols`, avoiding generic hot-path functions. Also, I need to identify specific `CONFIG_` options, checking Kconfig files for ifdefs and avoiding overly generic ones. Alright, so: * `EnableConfigs`: `["TIPC"]` – This is the config directly related to the changes. * `FocusSymbols`: `["tipc_node_create", "tipc_node_delete_from_list"]` – I'm listing both `tipc_node_create` and `tipc_node_delete_from_list`, as the patch impacts node creation and deletion, and therefore node count, which is functional in nature. I need to confirm `tipc_node_create` is reachable. Yes, through TIPC discovery. I'll also check callers of `tipc_node_create` to ensure I have identified all related functions. |
| 8/2 | 2026/07/11 13:09 | tool | grepper |
0mArgs:{
"Expression": "tipc_node_create",
"PathPrefix": "net/tipc/"
}Results: {
"Output": "net/tipc/crypto.c=1897=static void tipc_crypto_rcv_complete(struct net *net, struct tipc_aead *aead,\n--\nnet/tipc/crypto.c-1929-\t\t\tWARN_ON(ehdr-\u003euser != LINK_CONFIG);\nnet/tipc/crypto.c:1930:\t\t\tn = tipc_node_create(net, 0, ehdr-\u003eid, 0xffffu, 0,\nnet/tipc/crypto.c-1931-\t\t\t\t\t true);\n--\nnet/tipc/node.c=450=static void tipc_node_assign_peer_net(struct tipc_node *n, u32 hash_mixes)\n--\nnet/tipc/node.c-477-\nnet/tipc/node.c:478:struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id,\nnet/tipc/node.c-479-\t\t\t\t u16 capabilities, u32 hash_mixes,\n--\nnet/tipc/node.c-622-\ttipc_bcast_toggle_rcast(net, (tn-\u003ecapabilities \u0026 TIPC_BCAST_RCAST));\nnet/tipc/node.c:623:\ttrace_tipc_node_create(n, true, \" \");\nnet/tipc/node.c-624-exit:\n--\nnet/tipc/node.c=1185=void tipc_node_check_dest(struct net *net, u32 addr,\n--\nnet/tipc/node.c-1206-\nnet/tipc/node.c:1207:\tn = tipc_node_create(net, addr, peer_id, capabilities, hash_mixes,\nnet/tipc/node.c-1208-\t\t\t false);\n--\nnet/tipc/node.c=2986=static int __tipc_nl_node_set_key(struct sk_buff *skb, struct genl_info *info)\n--\nnet/tipc/node.c-3036-\t\t\tn = tipc_node_find_by_id(net, id) ?:\nnet/tipc/node.c:3037:\t\t\t\ttipc_node_create(net, 0, id, 0xffffu, 0, true);\nnet/tipc/node.c-3038-\t\t\tif (unlikely(!n))\n--\nnet/tipc/node.h=82=void tipc_node_get(struct tipc_node *node);\nnet/tipc/node.h:83:struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id,\nnet/tipc/node.h-84-\t\t\t\t u16 capabilities, u32 hash_mixes,\n--\nnet/tipc/trace.h=353=DEFINE_NODE_EVENT(tipc_node_dump);\nnet/tipc/trace.h:354:DEFINE_NODE_EVENT(tipc_node_create);\nnet/tipc/trace.h-355-DEFINE_NODE_EVENT(tipc_node_delete);\n"
} |
| 9/2 | 2026/07/11 13:09 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 7003 output: 111 thoughts: 17 Thoughts: Here's my take on the situation: **Fuzzing the Patch: A Go/No-Go Decision** Alright, looking at this patch, my initial assessment is that it's functional. That's a good starting point. Now, the real question is whether it's *fuzz-worthy*. And after a quick review, I'm leaning towards yes. I think there are potential areas where we could uncover some interesting edge cases or vulnerabilities. It has the right characteristics for fuzzing to be worthwhile. So, I'm going to green-light the fuzzing process. Time to initiate `set-results`. Let's see what we can dig up. |
| 10/2 | 2026/07/11 13:09 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"TIPC"
],
"FocusSymbols": [
"tipc_node_create",
"tipc_node_delete_from_list"
],
"Reasoning": "The patch introduces a hard limit on the number of TIPC nodes per net namespace to prevent unbounded memory growth. It modifies tipc_node_create to enforce this limit and updates the node count during creation and deletion. This is a functional change in core TIPC logic.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"TIPC"
],
"FocusSymbols": [
"tipc_node_create",
"tipc_node_delete_from_list"
],
"Reasoning": "The patch introduces a hard limit on the number of TIPC nodes per net namespace to prevent unbounded memory growth. It modifies tipc_node_create to enforce this limit and updates the node count during creation and deletion. This is a functional change in core TIPC logic.",
"WorthFuzzing": true
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|