[syzbot] [hams?] KASAN: slab-use-after-free Read in ax25_find_cb

1 view
Skip to first unread message

syzbot

unread,
Oct 23, 2025, 8:13:34 AM (2 days ago) Oct 23
to da...@davemloft.net, edum...@google.com, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, net...@vger.kernel.org, pab...@redhat.com, syzkall...@googlegroups.com
Hello,

syzbot found the following issue on:

HEAD commit: 250a17e8f955 Merge tag 'erofs-for-6.18-rc3-fixes' of git:/..
git tree: upstream
console output: https://syzkaller.appspot.com/x/log.txt?x=154a3734580000
kernel config: https://syzkaller.appspot.com/x/.config?x=d1ce99afe6f71855
dashboard link: https://syzkaller.appspot.com/bug?extid=caa052a0958a9146870d
compiler: gcc (Debian 12.2.0-14+deb12u1) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40

Unfortunately, I don't have any reproducer for this issue yet.

Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/f51301069523/disk-250a17e8.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/a4671c3f2507/vmlinux-250a17e8.xz
kernel image: https://storage.googleapis.com/syzbot-assets/2b5a3b36a321/bzImage-250a17e8.xz

IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+caa052...@syzkaller.appspotmail.com

==================================================================
BUG: KASAN: slab-use-after-free in ax25_find_cb+0x3b8/0x3f0 net/ax25/af_ax25.c:237
Read of size 1 at addr ffff888059c704c0 by task syz.6.2733/17200

CPU: 1 UID: 0 PID: 17200 Comm: syz.6.2733 Not tainted syzkaller #0 PREEMPT(full)
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/02/2025
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:94 [inline]
dump_stack_lvl+0x116/0x1f0 lib/dump_stack.c:120
print_address_description mm/kasan/report.c:378 [inline]
print_report+0xcd/0x630 mm/kasan/report.c:482
kasan_report+0xe0/0x110 mm/kasan/report.c:595
ax25_find_cb+0x3b8/0x3f0 net/ax25/af_ax25.c:237
ax25_send_frame+0x157/0xb60 net/ax25/ax25_out.c:55
rose_send_frame+0xcc/0x2c0 net/rose/rose_link.c:106
rose_transmit_restart_request+0x1b8/0x240 net/rose/rose_link.c:198
rose_t0timer_expiry+0x1d/0x150 net/rose/rose_link.c:83
call_timer_fn+0x19a/0x620 kernel/time/timer.c:1747
expire_timers kernel/time/timer.c:1798 [inline]
__run_timers+0x6ef/0x960 kernel/time/timer.c:2372
__run_timer_base kernel/time/timer.c:2384 [inline]
__run_timer_base kernel/time/timer.c:2376 [inline]
run_timer_base+0x114/0x190 kernel/time/timer.c:2393
run_timer_softirq+0x1a/0x40 kernel/time/timer.c:2403
handle_softirqs+0x219/0x8e0 kernel/softirq.c:622
__do_softirq kernel/softirq.c:656 [inline]
invoke_softirq kernel/softirq.c:496 [inline]
__irq_exit_rcu+0x109/0x170 kernel/softirq.c:723
irq_exit_rcu+0x9/0x30 kernel/softirq.c:739
instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1052 [inline]
sysvec_apic_timer_interrupt+0x57/0xc0 arch/x86/kernel/apic/apic.c:1052
asm_sysvec_apic_timer_interrupt+0x1a/0x20 arch/x86/include/asm/idtentry.h:697
RIP: 0033:0x7fd4a4c68253
Code: 1f 84 00 00 00 00 00 48 8b 70 f8 48 83 e8 08 48 39 f2 72 f3 48 39 c3 73 3e 48 89 33 48 83 c3 08 48 8b 70 f8 48 89 08 48 8b 0b <49> 8b 14 24 eb bf 48 39 f2 72 97 48 39 f0 73 46 49 89 34 24 48 89
RSP: 002b:00007ffd914df840 EFLAGS: 00000212
RAX: 00007fd4a4777648 RBX: 00007fd4a47774b0 RCX: ffffffff8a01d69a
RDX: ffffffff8a01d69a RSI: ffffffff8a01d69a RDI: 00007fd4a47777a0
RBP: 00007fd4a4777358 R08: 00007fd4a4777578 R09: 00007fd4a4fd2000
R10: 00007fd4a43fd008 R11: 000000000000000a R12: 00007fd4a4777350
R13: 0000000000000016 R14: 00007ffd914dfab8 R15: 00007fd4a43fd008
</TASK>

Allocated by task 13773:
kasan_save_stack+0x33/0x60 mm/kasan/common.c:56
kasan_save_track+0x14/0x30 mm/kasan/common.c:77
poison_kmalloc_redzone mm/kasan/common.c:400 [inline]
__kasan_kmalloc+0xaa/0xb0 mm/kasan/common.c:417
kmalloc_noprof include/linux/slab.h:957 [inline]
rose_add_node net/rose/rose_route.c:109 [inline]
rose_rt_ioctl+0x1c40/0x2580 net/rose/rose_route.c:748
rose_ioctl+0x64d/0x7c0 net/rose/af_rose.c:1381
sock_do_ioctl+0x118/0x280 net/socket.c:1254
sock_ioctl+0x227/0x6b0 net/socket.c:1375
vfs_ioctl fs/ioctl.c:51 [inline]
__do_sys_ioctl fs/ioctl.c:597 [inline]
__se_sys_ioctl fs/ioctl.c:583 [inline]
__x64_sys_ioctl+0x18e/0x210 fs/ioctl.c:583
do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
do_syscall_64+0xcd/0xfa0 arch/x86/entry/syscall_64.c:94
entry_SYSCALL_64_after_hwframe+0x77/0x7f

Freed by task 17183:
kasan_save_stack+0x33/0x60 mm/kasan/common.c:56
kasan_save_track+0x14/0x30 mm/kasan/common.c:77
__kasan_save_free_info+0x3b/0x60 mm/kasan/generic.c:587
kasan_save_free_info mm/kasan/kasan.h:406 [inline]
poison_slab_object mm/kasan/common.c:252 [inline]
__kasan_slab_free+0x5f/0x80 mm/kasan/common.c:284
kasan_slab_free include/linux/kasan.h:234 [inline]
slab_free_hook mm/slub.c:2530 [inline]
slab_free mm/slub.c:6619 [inline]
kfree+0x2b8/0x6d0 mm/slub.c:6826
rose_neigh_put include/net/rose.h:165 [inline]
rose_timer_expiry+0x537/0x630 net/rose/rose_timer.c:183
call_timer_fn+0x19a/0x620 kernel/time/timer.c:1747
expire_timers kernel/time/timer.c:1798 [inline]
__run_timers+0x6ef/0x960 kernel/time/timer.c:2372
__run_timer_base kernel/time/timer.c:2384 [inline]
__run_timer_base kernel/time/timer.c:2376 [inline]
run_timer_base+0x114/0x190 kernel/time/timer.c:2393
run_timer_softirq+0x1a/0x40 kernel/time/timer.c:2403
handle_softirqs+0x219/0x8e0 kernel/softirq.c:622
__do_softirq kernel/softirq.c:656 [inline]
invoke_softirq kernel/softirq.c:496 [inline]
__irq_exit_rcu+0x109/0x170 kernel/softirq.c:723
irq_exit_rcu+0x9/0x30 kernel/softirq.c:739
instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1052 [inline]
sysvec_apic_timer_interrupt+0xa4/0xc0 arch/x86/kernel/apic/apic.c:1052
asm_sysvec_apic_timer_interrupt+0x1a/0x20 arch/x86/include/asm/idtentry.h:697

The buggy address belongs to the object at ffff888059c70480
which belongs to the cache kmalloc-96 of size 96
The buggy address is located 64 bytes inside of
freed 96-byte region [ffff888059c70480, ffff888059c704e0)

The buggy address belongs to the physical page:
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0xffff888059c70b00 pfn:0x59c70
flags: 0xfff00000000200(workingset|node=0|zone=1|lastcpupid=0x7ff)
page_type: f5(slab)
raw: 00fff00000000200 ffff88813ffa6280 ffffea0001df33d0 ffffea0000c94410
raw: ffff888059c70b00 000000000020001f 00000000f5000000 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as allocated
page last allocated via order 0, migratetype Unmovable, gfp_mask 0x52cc0(GFP_KERNEL|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP), pid 5815, tgid 5815 (syz-executor), ts 66851059499, free_ts 66850862508
set_page_owner include/linux/page_owner.h:32 [inline]
post_alloc_hook+0x1c0/0x230 mm/page_alloc.c:1850
prep_new_page mm/page_alloc.c:1858 [inline]
get_page_from_freelist+0x10a3/0x3a30 mm/page_alloc.c:3884
__alloc_frozen_pages_noprof+0x25f/0x2470 mm/page_alloc.c:5183
alloc_pages_mpol+0x1fb/0x550 mm/mempolicy.c:2416
alloc_slab_page mm/slub.c:3046 [inline]
allocate_slab mm/slub.c:3219 [inline]
new_slab+0x24a/0x360 mm/slub.c:3273
___slab_alloc+0xdc4/0x1ae0 mm/slub.c:4643
__slab_alloc.constprop.0+0x63/0x110 mm/slub.c:4762
__slab_alloc_node mm/slub.c:4838 [inline]
slab_alloc_node mm/slub.c:5260 [inline]
__kmalloc_cache_noprof+0x477/0x780 mm/slub.c:5750
kmalloc_noprof include/linux/slab.h:957 [inline]
kzalloc_noprof include/linux/slab.h:1094 [inline]
class_dir_create_and_add drivers/base/core.c:3223 [inline]
get_device_parent+0x2b1/0x4e0 drivers/base/core.c:3283
device_add+0x1ad/0x1aa0 drivers/base/core.c:3613
netdev_register_kobject+0x1a9/0x3d0 net/core/net-sysfs.c:2358
register_netdevice+0x13dc/0x2270 net/core/dev.c:11294
cfg80211_register_netdevice+0x149/0x340 net/wireless/core.c:1518
ieee80211_if_add+0xc9d/0x1a40 net/mac80211/iface.c:2295
ieee80211_register_hw+0x393b/0x4120 net/mac80211/main.c:1608
mac80211_hwsim_new_radio+0x32d8/0x50b0 drivers/net/wireless/virtual/mac80211_hwsim.c:5803
page last free pid 5815 tgid 5815 stack trace:
reset_page_owner include/linux/page_owner.h:25 [inline]
free_pages_prepare mm/page_alloc.c:1394 [inline]
__free_frozen_pages+0x7df/0x1160 mm/page_alloc.c:2906
selinux_genfs_get_sid security/selinux/hooks.c:1357 [inline]
inode_doinit_with_dentry+0xacb/0x12e0 security/selinux/hooks.c:1555
selinux_d_instantiate+0x26/0x30 security/selinux/hooks.c:6523
security_d_instantiate+0x142/0x1a0 security/security.c:4148
d_instantiate+0x5c/0x90 fs/dcache.c:1961
__debugfs_create_file+0x286/0x6b0 fs/debugfs/inode.c:459
debugfs_create_file_short+0x41/0x60 fs/debugfs/inode.c:480
add_link_files+0xff/0x120 net/mac80211/debugfs_netdev.c:990
ieee80211_debugfs_add_netdev net/mac80211/debugfs_netdev.c:1011 [inline]
ieee80211_debugfs_recreate_netdev+0xf70/0x17e0 net/mac80211/debugfs_netdev.c:1033
ieee80211_if_add+0x9b9/0x1a40 net/mac80211/iface.c:2269
ieee80211_register_hw+0x393b/0x4120 net/mac80211/main.c:1608
mac80211_hwsim_new_radio+0x32d8/0x50b0 drivers/net/wireless/virtual/mac80211_hwsim.c:5803
hwsim_new_radio_nl+0xba2/0x1330 drivers/net/wireless/virtual/mac80211_hwsim.c:6497
genl_family_rcv_msg_doit+0x209/0x2f0 net/netlink/genetlink.c:1115
genl_family_rcv_msg net/netlink/genetlink.c:1195 [inline]
genl_rcv_msg+0x55c/0x800 net/netlink/genetlink.c:1210
netlink_rcv_skb+0x158/0x420 net/netlink/af_netlink.c:2552

Memory state around the buggy address:
ffff888059c70380: 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc fc
ffff888059c70400: 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc fc
>ffff888059c70480: fa fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
^
ffff888059c70500: 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc fc
ffff888059c70580: 00 00 00 00 00 00 00 00 00 fc fc fc fc fc fc fc
==================================================================


---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzk...@googlegroups.com.

syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.

If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title

If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)

If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report

If you want to undo deduplication, reply with:
#syz undup

Lizhi Xu

unread,
Oct 23, 2025, 9:32:04 PM (2 days ago) Oct 23
to syzbot+caa052...@syzkaller.appspotmail.com, da...@davemloft.net, edum...@google.com, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, net...@vger.kernel.org, pab...@redhat.com, syzkall...@googlegroups.com
There is no synchronization between the two timers, rose_t0timer_expiry
and rose_timer_expiry.
rose_timer_expiry() puts the neighbor when the rose state is ROSE_STATE_2.
However, rose_t0timer_expiry() does initiate a restart request on the
neighbor.
When rose_t0timer_expiry() accesses the released neighbor member digipeat,
a UAF is triggered.

To avoid this uaf, when rose_timer_expiry() puts the neighbor, the base
member digipeat is set to NULL.

syzbot reported a slab-use-after-free Read in ax25_find_cb.
BUG: KASAN: slab-use-after-free in ax25_find_cb+0x3b8/0x3f0 net/ax25/af_ax25.c:237
Read of size 1 at addr ffff888059c704c0 by task syz.6.2733/17200

Call Trace:
ax25_find_cb+0x3b8/0x3f0 net/ax25/af_ax25.c:237
ax25_send_frame+0x157/0xb60 net/ax25/ax25_out.c:55
rose_send_frame+0xcc/0x2c0 net/rose/rose_link.c:106
rose_transmit_restart_request+0x1b8/0x240 net/rose/rose_link.c:198
rose_t0timer_expiry+0x1d/0x150 net/rose/rose_link.c:83

Freed by task 17183:
kfree+0x2b8/0x6d0 mm/slub.c:6826
rose_neigh_put include/net/rose.h:165 [inline]
rose_timer_expiry+0x537/0x630 net/rose/rose_timer.c:183
call_timer_fn+0x19a/0x620 kernel/time/timer.c:1747

Fixes: dcb34659028f ("net: rose: split remove and free operations in rose_remove_neigh()")
Reported-by: syzbot+caa052...@syzkaller.appspotmail.com
Signed-off-by: Lizhi Xu <lizh...@windriver.com>
---
include/net/rose.h | 1 +
1 file changed, 1 insertion(+)

diff --git a/include/net/rose.h b/include/net/rose.h
index 2b5491bbf39a..9b0dc81a9589 100644
--- a/include/net/rose.h
+++ b/include/net/rose.h
@@ -163,6 +163,7 @@ static inline void rose_neigh_put(struct rose_neigh *rose_neigh)
if (rose_neigh->ax25)
ax25_cb_put(rose_neigh->ax25);
kfree(rose_neigh->digipeat);
+ rose_neigh->digipeat = NULL;
kfree(rose_neigh);
}
}
--
2.43.0

Kuniyuki Iwashima

unread,
Oct 23, 2025, 11:18:05 PM (2 days ago) Oct 23
to lizh...@windriver.com, da...@davemloft.net, edum...@google.com, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com, kun...@google.com
From: Lizhi Xu <lizh...@windriver.com>
Date: Fri, 24 Oct 2025 09:31:53 +0800
How does this synchronise with the timer which is going to
touch rose_neigh being freed below ?


> kfree(rose_neigh);

Isn't the problem that we reach here without stopping all timers
or that a timer does not hold refcnt ?


Also, please post a patch in a separate thread so that patchwork
will not be confused.

https://www.kernel.org/doc/html/latest/process/maintainer-netdev.html#resending-after-review

---8<---
The new version of patches should be posted as a separate
thread, not as a reply to the previous posting.
---8<---

Lizhi Xu

unread,
Oct 24, 2025, 5:05:32 AM (20 hours ago) Oct 24
to kun...@google.com, da...@davemloft.net, edum...@google.com, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, lizh...@windriver.com, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
There is no synchronization between the two timers, rose_t0timer_expiry
and rose_timer_expiry.
rose_timer_expiry() puts the neighbor when the rose state is ROSE_STATE_2.
However, rose_t0timer_expiry() does initiate a restart request on the
neighbor.
When rose_t0timer_expiry() accesses the released neighbor member digipeat,
a UAF is triggered.

To avoid this UAF, defer the put operation to rose_t0timer_expiry() and
stop restarting t0timer after putting the neighbor.

When putting the neighbor, set the neighbor to NULL. Setting neighbor to
NULL prevents rose_t0timer_expiry() from restarting t0timer.

syzbot reported a slab-use-after-free Read in ax25_find_cb.
BUG: KASAN: slab-use-after-free in ax25_find_cb+0x3b8/0x3f0 net/ax25/af_ax25.c:237
Read of size 1 at addr ffff888059c704c0 by task syz.6.2733/17200
Call Trace:
ax25_find_cb+0x3b8/0x3f0 net/ax25/af_ax25.c:237
ax25_send_frame+0x157/0xb60 net/ax25/ax25_out.c:55
rose_send_frame+0xcc/0x2c0 net/rose/rose_link.c:106
rose_transmit_restart_request+0x1b8/0x240 net/rose/rose_link.c:198
rose_t0timer_expiry+0x1d/0x150 net/rose/rose_link.c:83

Freed by task 17183:
kfree+0x2b8/0x6d0 mm/slub.c:6826
rose_neigh_put include/net/rose.h:165 [inline]
rose_timer_expiry+0x537/0x630 net/rose/rose_timer.c:183

Fixes: d860d1faa6b2 ("net: rose: convert 'use' field to refcount_t")
Reported-by: syzbot+caa052...@syzkaller.appspotmail.com
Signed-off-by: Lizhi Xu <lizh...@windriver.com>
---
V1 -> V2: Putting the neighbor stops t0timer from automatically starting

include/net/rose.h | 1 +
net/rose/rose_link.c | 5 +++++
2 files changed, 6 insertions(+)

diff --git a/include/net/rose.h b/include/net/rose.h
index 2b5491bbf39a..ecf37c8e24bb 100644
--- a/include/net/rose.h
+++ b/include/net/rose.h
@@ -164,6 +164,7 @@ static inline void rose_neigh_put(struct rose_neigh *rose_neigh)
ax25_cb_put(rose_neigh->ax25);
kfree(rose_neigh->digipeat);
kfree(rose_neigh);
+ rose_neigh = NULL;
}
}

diff --git a/net/rose/rose_link.c b/net/rose/rose_link.c
index 7746229fdc8c..524e7935bd02 100644
--- a/net/rose/rose_link.c
+++ b/net/rose/rose_link.c
@@ -43,6 +43,9 @@ void rose_start_ftimer(struct rose_neigh *neigh)

static void rose_start_t0timer(struct rose_neigh *neigh)
{
+ if (!neigh)
+ return;
+
timer_delete(&neigh->t0timer);

neigh->t0timer.function = rose_t0timer_expiry;
@@ -80,10 +83,12 @@ static void rose_t0timer_expiry(struct timer_list *t)
{
struct rose_neigh *neigh = timer_container_of(neigh, t, t0timer);

+ rose_neigh_hold(neigh);
rose_transmit_restart_request(neigh);

neigh->dce_mode = 0;

+ rose_neigh_put(neigh);
rose_start_t0timer(neigh);
}

--
2.43.0

Lizhi Xu

unread,
Oct 24, 2025, 5:06:39 AM (20 hours ago) Oct 24
to kun...@google.com, da...@davemloft.net, edum...@google.com, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, lizh...@windriver.com, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com

Eric Dumazet

unread,
Oct 24, 2025, 5:20:00 AM (20 hours ago) Oct 24
to Lizhi Xu, kun...@google.com, da...@davemloft.net, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
What is the purpose of this added line ?

@rose_neigh is a local variable. Setting it to NULL while this
function no longer uses it is
going to be optimized out by the compiler. Even if not optimized, this
has no effect.


> }
> }
>
> diff --git a/net/rose/rose_link.c b/net/rose/rose_link.c
> index 7746229fdc8c..524e7935bd02 100644
> --- a/net/rose/rose_link.c
> +++ b/net/rose/rose_link.c
> @@ -43,6 +43,9 @@ void rose_start_ftimer(struct rose_neigh *neigh)
>
> static void rose_start_t0timer(struct rose_neigh *neigh)
> {
> + if (!neigh)
> + return;

This will never fire. callers would have crashed already it neigh was NULL.

> +
> timer_delete(&neigh->t0timer);
>
> neigh->t0timer.function = rose_t0timer_expiry;
> @@ -80,10 +83,12 @@ static void rose_t0timer_expiry(struct timer_list *t)
> {
> struct rose_neigh *neigh = timer_container_of(neigh, t, t0timer);
>

Can you explain (in a comment) why this is needed ?
What is the precise scenario you want to avoid ?

> + rose_neigh_hold(neigh);
> rose_transmit_restart_request(neigh);
>
> neigh->dce_mode = 0;
>
> + rose_neigh_put(neigh);

I am pretty sure this patch fixes nothing at all.

> rose_start_t0timer(neigh);
> }
>
> --
> 2.43.0
>

Lizhi Xu

unread,
Oct 24, 2025, 5:39:12 AM (19 hours ago) Oct 24
to edum...@google.com, da...@davemloft.net, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, kun...@google.com, linux...@vger.kernel.org, linux-...@vger.kernel.org, lizh...@windriver.com, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
V2 -> V3: add rose_neigh_putex for set rose neigh to NULL

include/net/rose.h | 12 ++++++++++++
net/rose/rose_link.c | 5 +++++
2 files changed, 17 insertions(+)

diff --git a/include/net/rose.h b/include/net/rose.h
index 2b5491bbf39a..33de310ba778 100644
--- a/include/net/rose.h
+++ b/include/net/rose.h
@@ -167,6 +167,18 @@ static inline void rose_neigh_put(struct rose_neigh *rose_neigh)
}
}

+static inline void rose_neigh_putex(struct rose_neigh **roseneigh)
+{
+ struct rose_neigh *rose_neigh = *roseneigh;
+ if (refcount_dec_and_test(&rose_neigh->use)) {
+ if (rose_neigh->ax25)
+ ax25_cb_put(rose_neigh->ax25);
+ kfree(rose_neigh->digipeat);
+ kfree(rose_neigh);
+ *roseneigh = NULL;
+ }
+}
+
/* af_rose.c */
extern ax25_address rose_callsign;
extern int sysctl_rose_restart_request_timeout;
diff --git a/net/rose/rose_link.c b/net/rose/rose_link.c
index 7746229fdc8c..334c8cc0876d 100644
--- a/net/rose/rose_link.c
+++ b/net/rose/rose_link.c
@@ -43,6 +43,9 @@ void rose_start_ftimer(struct rose_neigh *neigh)

static void rose_start_t0timer(struct rose_neigh *neigh)
{
+ if (!neigh)
+ return;
+
timer_delete(&neigh->t0timer);

neigh->t0timer.function = rose_t0timer_expiry;
@@ -80,10 +83,12 @@ static void rose_t0timer_expiry(struct timer_list *t)
{
struct rose_neigh *neigh = timer_container_of(neigh, t, t0timer);

+ rose_neigh_hold(neigh);
rose_transmit_restart_request(neigh);

neigh->dce_mode = 0;

+ rose_neigh_putex(&neigh);
rose_start_t0timer(neigh);
}

--
2.43.0

Eric Dumazet

unread,
Oct 24, 2025, 7:50:09 AM (17 hours ago) Oct 24
to Lizhi Xu, da...@davemloft.net, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, kun...@google.com, linux...@vger.kernel.org, linux-...@vger.kernel.org, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
You have not even compiled this patch.

Also please carefully read Documentation/process/maintainer-netdev.rst

Resending after review
~~~~~~~~~~~~~~~~~~~~~~

Allow at least 24 hours to pass between postings. This will ensure reviewers
from all geographical locations have a chance to chime in. Do not wait
too long (weeks) between postings either as it will make it harder for reviewers
to recall all the context.

Make sure you address all the feedback in your new posting. Do not post a new
version of the code if the discussion about the previous version is still
ongoing, unless directly instructed by a reviewer.

The new version of patches should be posted as a separate thread,
not as a reply to the previous posting. Change log should include a link
to the previous posting (see :ref:`Changes requested`).

Jakub Kicinski

unread,
Oct 24, 2025, 7:58:42 PM (5 hours ago) Oct 24
to Lizhi Xu, kun...@google.com, da...@davemloft.net, edum...@google.com, ho...@kernel.org, jre...@yaina.de, linux...@vger.kernel.org, linux-...@vger.kernel.org, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
On Fri, 24 Oct 2025 17:05:21 +0800 Lizhi Xu wrote:
> There is no synchronization between the two timers, rose_t0timer_expiry
> and rose_timer_expiry.
> rose_timer_expiry() puts the neighbor when the rose state is ROSE_STATE_2.
> However, rose_t0timer_expiry() does initiate a restart request on the
> neighbor.

Read what reviewers tell you please.

Kuniyuki already told you not to send patches in reply to existing
threads.

Lizhi Xu

unread,
Oct 24, 2025, 9:48:59 PM (3 hours ago) Oct 24
to edum...@google.com, da...@davemloft.net, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, kun...@google.com, linux...@vger.kernel.org, linux-...@vger.kernel.org, lizh...@windriver.com, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
580K -rw-r--r-- 1 lzx users 578K Oct 24 17:35 net/rose/rose_link.o

Kuniyuki Iwashima

unread,
Oct 24, 2025, 10:18:59 PM (3 hours ago) Oct 24
to Lizhi Xu, edum...@google.com, da...@davemloft.net, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
On Fri, Oct 24, 2025 at 2:39 AM Lizhi Xu <lizh...@windriver.com> wrote:
>
What prevents rose_timer_expiry() from releasing the
last refcnt here ?

The t0timer could be triggered even after that happens.

Lizhi Xu

unread,
Oct 24, 2025, 11:52:00 PM (1 hour ago) Oct 24
to kun...@google.com, da...@davemloft.net, edum...@google.com, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, lizh...@windriver.com, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
The issue reported by syzbot is that rose_t0timer_expiry() is triggered
first, followed by rose_timer_expiry().
Therefore, in rose_t0timer_expiry(), the reference count of neigh is
increased before entering rose_transmit_restart_request() to prevent
neigh from being put in rose_timer_expiry(). Then, in rose_t0timer_expiry(),
neigh is put before executing rose_start_t0timer() and the neigh value is
set to NULL to prevent t0timer restarts.

The case where rose_timer_expiry() is triggered before rose_t0timer_expiry()
is not considered at this time.

Kuniyuki Iwashima

unread,
12:25 AM (1 hour ago) 12:25 AM
to Lizhi Xu, da...@davemloft.net, edum...@google.com, ho...@kernel.org, jre...@yaina.de, ku...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, net...@vger.kernel.org, pab...@redhat.com, syzbot+caa052...@syzkaller.appspotmail.com, syzkall...@googlegroups.com
I don't see how you read that ordering from the report.
https://syzkaller.appspot.com/bug?extid=caa052a0958a9146870d

The only ordering I can find is that kfree() in rose_timer_expiry()
happened before ax25_find_cb () in rose_t0timer_expiry().

> Therefore, in rose_t0timer_expiry(), the reference count of neigh is
> increased before entering rose_transmit_restart_request() to prevent
> neigh from being put in rose_timer_expiry(). Then, in rose_t0timer_expiry(),
> neigh is put before executing rose_start_t0timer() and the neigh value is
> set to NULL to prevent t0timer restarts.
>
> The case where rose_timer_expiry() is triggered before rose_t0timer_expiry()
> is not considered at this time.

So this change just papers over the root cause.
Reply all
Reply to author
Forward
0 new messages