* [PATCH net-next] ipv6: add debug checks in fib6_info_release()
@ 2023-12-05 17:32 Eric Dumazet
2023-12-06 3:41 ` David Ahern
` (2 more replies)
0 siblings, 3 replies; 22+ messages in thread
From: Eric Dumazet @ 2023-12-05 17:32 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni
Cc: David Ahern, netdev, eric.dumazet, Eric Dumazet
Some elusive syzbot reports are hinting to fib6_info_release(),
with a potential dangling f6i->gc_link anchor.
Add debug checks so that syzbot can catch the issue earlier eventually.
BUG: KASAN: slab-use-after-free in __hlist_del include/linux/list.h:990 [inline]
BUG: KASAN: slab-use-after-free in hlist_del_init include/linux/list.h:1016 [inline]
BUG: KASAN: slab-use-after-free in fib6_clean_expires_locked include/net/ip6_fib.h:533 [inline]
BUG: KASAN: slab-use-after-free in fib6_purge_rt+0x986/0x9c0 net/ipv6/ip6_fib.c:1064
Write of size 8 at addr ffff88802805a840 by task syz-executor.1/10057
CPU: 1 PID: 10057 Comm: syz-executor.1 Not tainted 6.7.0-rc2-syzkaller-00029-g9b6de136b5f0 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/10/2023
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:88 [inline]
dump_stack_lvl+0xd9/0x1b0 lib/dump_stack.c:106
print_address_description mm/kasan/report.c:364 [inline]
print_report+0xc4/0x620 mm/kasan/report.c:475
kasan_report+0xda/0x110 mm/kasan/report.c:588
__hlist_del include/linux/list.h:990 [inline]
hlist_del_init include/linux/list.h:1016 [inline]
fib6_clean_expires_locked include/net/ip6_fib.h:533 [inline]
fib6_purge_rt+0x986/0x9c0 net/ipv6/ip6_fib.c:1064
fib6_del_route net/ipv6/ip6_fib.c:1993 [inline]
fib6_del+0xa7a/0x1750 net/ipv6/ip6_fib.c:2038
__ip6_del_rt net/ipv6/route.c:3866 [inline]
ip6_del_rt+0xf7/0x200 net/ipv6/route.c:3881
ndisc_router_discovery+0x295b/0x3560 net/ipv6/ndisc.c:1372
ndisc_rcv+0x3de/0x5f0 net/ipv6/ndisc.c:1856
icmpv6_rcv+0x1470/0x19c0 net/ipv6/icmp.c:979
ip6_protocol_deliver_rcu+0x170/0x13e0 net/ipv6/ip6_input.c:438
ip6_input_finish+0x14f/0x2f0 net/ipv6/ip6_input.c:483
NF_HOOK include/linux/netfilter.h:314 [inline]
NF_HOOK include/linux/netfilter.h:308 [inline]
ip6_input+0xa1/0xc0 net/ipv6/ip6_input.c:492
ip6_mc_input+0x48b/0xf40 net/ipv6/ip6_input.c:586
dst_input include/net/dst.h:461 [inline]
ip6_rcv_finish net/ipv6/ip6_input.c:79 [inline]
NF_HOOK include/linux/netfilter.h:314 [inline]
NF_HOOK include/linux/netfilter.h:308 [inline]
ipv6_rcv+0x24e/0x380 net/ipv6/ip6_input.c:310
__netif_receive_skb_one_core+0x115/0x180 net/core/dev.c:5529
__netif_receive_skb+0x1f/0x1b0 net/core/dev.c:5643
netif_receive_skb_internal net/core/dev.c:5729 [inline]
netif_receive_skb+0x133/0x700 net/core/dev.c:5788
tun_rx_batched+0x429/0x780 drivers/net/tun.c:1579
tun_get_user+0x29e3/0x3bc0 drivers/net/tun.c:2002
tun_chr_write_iter+0xe8/0x210 drivers/net/tun.c:2048
call_write_iter include/linux/fs.h:2020 [inline]
new_sync_write fs/read_write.c:491 [inline]
vfs_write+0x64f/0xdf0 fs/read_write.c:584
ksys_write+0x12f/0x250 fs/read_write.c:637
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82
entry_SYSCALL_64_after_hwframe+0x63/0x6b
RIP: 0033:0x7f38e387b82f
Code: 89 54 24 18 48 89 74 24 10 89 7c 24 08 e8 b9 80 02 00 48 8b 54 24 18 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 31 44 89 c7 48 89 44 24 08 e8 0c 81 02 00 48
RSP: 002b:00007f38e45c9090 EFLAGS: 00000293 ORIG_RAX: 0000000000000001
RAX: ffffffffffffffda RBX: 00007f38e399bf80 RCX: 00007f38e387b82f
RDX: 00000000000003b6 RSI: 0000000020000680 RDI: 00000000000000c8
RBP: 00007f38e38c847a R08: 0000000000000000 R09: 0000000000000000
R10: 00000000000003b6 R11: 0000000000000293 R12: 0000000000000000
R13: 000000000000000b R14: 00007f38e399bf80 R15: 00007f38e3abfa48
</TASK>
Allocated by task 10044:
kasan_save_stack+0x33/0x50 mm/kasan/common.c:45
kasan_set_track+0x25/0x30 mm/kasan/common.c:52
____kasan_kmalloc mm/kasan/common.c:374 [inline]
__kasan_kmalloc+0xa2/0xb0 mm/kasan/common.c:383
kasan_kmalloc include/linux/kasan.h:198 [inline]
__do_kmalloc_node mm/slab_common.c:1007 [inline]
__kmalloc+0x59/0x90 mm/slab_common.c:1020
kmalloc include/linux/slab.h:604 [inline]
kzalloc include/linux/slab.h:721 [inline]
fib6_info_alloc+0x40/0x160 net/ipv6/ip6_fib.c:155
ip6_route_info_create+0x337/0x1e70 net/ipv6/route.c:3749
ip6_route_add+0x26/0x150 net/ipv6/route.c:3843
rt6_add_route_info+0x2e7/0x4b0 net/ipv6/route.c:4316
rt6_route_rcv+0x76c/0xbf0 net/ipv6/route.c:985
ndisc_router_discovery+0x138b/0x3560 net/ipv6/ndisc.c:1529
ndisc_rcv+0x3de/0x5f0 net/ipv6/ndisc.c:1856
icmpv6_rcv+0x1470/0x19c0 net/ipv6/icmp.c:979
ip6_protocol_deliver_rcu+0x170/0x13e0 net/ipv6/ip6_input.c:438
ip6_input_finish+0x14f/0x2f0 net/ipv6/ip6_input.c:483
NF_HOOK include/linux/netfilter.h:314 [inline]
NF_HOOK include/linux/netfilter.h:308 [inline]
ip6_input+0xa1/0xc0 net/ipv6/ip6_input.c:492
ip6_mc_input+0x48b/0xf40 net/ipv6/ip6_input.c:586
dst_input include/net/dst.h:461 [inline]
ip6_rcv_finish net/ipv6/ip6_input.c:79 [inline]
NF_HOOK include/linux/netfilter.h:314 [inline]
NF_HOOK include/linux/netfilter.h:308 [inline]
ipv6_rcv+0x24e/0x380 net/ipv6/ip6_input.c:310
__netif_receive_skb_one_core+0x115/0x180 net/core/dev.c:5529
__netif_receive_skb+0x1f/0x1b0 net/core/dev.c:5643
netif_receive_skb_internal net/core/dev.c:5729 [inline]
netif_receive_skb+0x133/0x700 net/core/dev.c:5788
tun_rx_batched+0x429/0x780 drivers/net/tun.c:1579
tun_get_user+0x29e3/0x3bc0 drivers/net/tun.c:2002
tun_chr_write_iter+0xe8/0x210 drivers/net/tun.c:2048
call_write_iter include/linux/fs.h:2020 [inline]
new_sync_write fs/read_write.c:491 [inline]
vfs_write+0x64f/0xdf0 fs/read_write.c:584
ksys_write+0x12f/0x250 fs/read_write.c:637
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82
entry_SYSCALL_64_after_hwframe+0x63/0x6b
Freed by task 5123:
kasan_save_stack+0x33/0x50 mm/kasan/common.c:45
kasan_set_track+0x25/0x30 mm/kasan/common.c:52
kasan_save_free_info+0x2b/0x40 mm/kasan/generic.c:522
____kasan_slab_free mm/kasan/common.c:236 [inline]
____kasan_slab_free+0x15b/0x1b0 mm/kasan/common.c:200
kasan_slab_free include/linux/kasan.h:164 [inline]
slab_free_hook mm/slub.c:1800 [inline]
slab_free_freelist_hook+0x114/0x1e0 mm/slub.c:1826
slab_free mm/slub.c:3809 [inline]
__kmem_cache_free+0xc0/0x180 mm/slub.c:3822
rcu_do_batch kernel/rcu/tree.c:2158 [inline]
rcu_core+0x819/0x1680 kernel/rcu/tree.c:2431
__do_softirq+0x21a/0x8de kernel/softirq.c:553
Last potentially related work creation:
kasan_save_stack+0x33/0x50 mm/kasan/common.c:45
__kasan_record_aux_stack+0xbc/0xd0 mm/kasan/generic.c:492
__call_rcu_common.constprop.0+0x9a/0x7a0 kernel/rcu/tree.c:2681
fib6_info_release include/net/ip6_fib.h:332 [inline]
fib6_info_release include/net/ip6_fib.h:329 [inline]
rt6_route_rcv+0xa4e/0xbf0 net/ipv6/route.c:997
ndisc_router_discovery+0x138b/0x3560 net/ipv6/ndisc.c:1529
ndisc_rcv+0x3de/0x5f0 net/ipv6/ndisc.c:1856
icmpv6_rcv+0x1470/0x19c0 net/ipv6/icmp.c:979
ip6_protocol_deliver_rcu+0x170/0x13e0 net/ipv6/ip6_input.c:438
ip6_input_finish+0x14f/0x2f0 net/ipv6/ip6_input.c:483
NF_HOOK include/linux/netfilter.h:314 [inline]
NF_HOOK include/linux/netfilter.h:308 [inline]
ip6_input+0xa1/0xc0 net/ipv6/ip6_input.c:492
ip6_mc_input+0x48b/0xf40 net/ipv6/ip6_input.c:586
dst_input include/net/dst.h:461 [inline]
ip6_rcv_finish net/ipv6/ip6_input.c:79 [inline]
NF_HOOK include/linux/netfilter.h:314 [inline]
NF_HOOK include/linux/netfilter.h:308 [inline]
ipv6_rcv+0x24e/0x380 net/ipv6/ip6_input.c:310
__netif_receive_skb_one_core+0x115/0x180 net/core/dev.c:5529
__netif_receive_skb+0x1f/0x1b0 net/core/dev.c:5643
netif_receive_skb_internal net/core/dev.c:5729 [inline]
netif_receive_skb+0x133/0x700 net/core/dev.c:5788
tun_rx_batched+0x429/0x780 drivers/net/tun.c:1579
tun_get_user+0x29e3/0x3bc0 drivers/net/tun.c:2002
tun_chr_write_iter+0xe8/0x210 drivers/net/tun.c:2048
call_write_iter include/linux/fs.h:2020 [inline]
new_sync_write fs/read_write.c:491 [inline]
vfs_write+0x64f/0xdf0 fs/read_write.c:584
ksys_write+0x12f/0x250 fs/read_write.c:637
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82
entry_SYSCALL_64_after_hwframe+0x63/0x6b
Second to last potentially related work creation:
kasan_save_stack+0x33/0x50 mm/kasan/common.c:45
__kasan_record_aux_stack+0xbc/0xd0 mm/kasan/generic.c:492
insert_work+0x38/0x230 kernel/workqueue.c:1647
__queue_work+0xcdc/0x11f0 kernel/workqueue.c:1803
call_timer_fn+0x193/0x590 kernel/time/timer.c:1700
expire_timers kernel/time/timer.c:1746 [inline]
__run_timers+0x585/0xb20 kernel/time/timer.c:2022
run_timer_softirq+0x58/0xd0 kernel/time/timer.c:2035
__do_softirq+0x21a/0x8de kernel/softirq.c:553
The buggy address belongs to the object at ffff88802805a800
which belongs to the cache kmalloc-512 of size 512
The buggy address is located 64 bytes inside of
freed 512-byte region [ffff88802805a800, ffff88802805aa00)
The buggy address belongs to the physical page:
page:ffffea0000a01600 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x28058
head:ffffea0000a01600 order:2 entire_mapcount:0 nr_pages_mapped:0 pincount:0
flags: 0xfff00000000840(slab|head|node=0|zone=1|lastcpupid=0x7ff)
page_type: 0xffffffff()
raw: 00fff00000000840 ffff888013041c80 ffffea0001e02600 dead000000000002
raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as allocated
page last allocated via order 2, migratetype Unmovable, gfp_mask 0x1d20c0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__GFP_HARDWALL), pid 18706, tgid 18699 (syz-executor.2), ts 999991973280, free_ts 996884464281
set_page_owner include/linux/page_owner.h:31 [inline]
post_alloc_hook+0x2d0/0x350 mm/page_alloc.c:1537
prep_new_page mm/page_alloc.c:1544 [inline]
get_page_from_freelist+0xa25/0x36d0 mm/page_alloc.c:3312
__alloc_pages+0x22e/0x2420 mm/page_alloc.c:4568
alloc_pages_mpol+0x258/0x5f0 mm/mempolicy.c:2133
alloc_slab_page mm/slub.c:1870 [inline]
allocate_slab mm/slub.c:2017 [inline]
new_slab+0x283/0x3c0 mm/slub.c:2070
___slab_alloc+0x979/0x1500 mm/slub.c:3223
__slab_alloc.constprop.0+0x56/0xa0 mm/slub.c:3322
__slab_alloc_node mm/slub.c:3375 [inline]
slab_alloc_node mm/slub.c:3468 [inline]
__kmem_cache_alloc_node+0x131/0x310 mm/slub.c:3517
__do_kmalloc_node mm/slab_common.c:1006 [inline]
__kmalloc+0x49/0x90 mm/slab_common.c:1020
kmalloc include/linux/slab.h:604 [inline]
kzalloc include/linux/slab.h:721 [inline]
copy_splice_read+0x1ac/0x8f0 fs/splice.c:338
vfs_splice_read fs/splice.c:992 [inline]
vfs_splice_read+0x2ea/0x3b0 fs/splice.c:962
splice_direct_to_actor+0x2a5/0xa30 fs/splice.c:1069
do_splice_direct+0x1af/0x280 fs/splice.c:1194
do_sendfile+0xb3e/0x1310 fs/read_write.c:1254
__do_sys_sendfile64 fs/read_write.c:1322 [inline]
__se_sys_sendfile64 fs/read_write.c:1308 [inline]
__x64_sys_sendfile64+0x1d6/0x220 fs/read_write.c:1308
do_syscall_x64 arch/x86/entry/common.c:51 [inline]
do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82
page last free stack trace:
reset_page_owner include/linux/page_owner.h:24 [inline]
free_pages_prepare mm/page_alloc.c:1137 [inline]
free_unref_page_prepare+0x4fa/0xaa0 mm/page_alloc.c:2347
free_unref_page_list+0xe6/0xb40 mm/page_alloc.c:2533
release_pages+0x32a/0x14f0 mm/swap.c:1042
tlb_batch_pages_flush+0x9a/0x190 mm/mmu_gather.c:98
tlb_flush_mmu_free mm/mmu_gather.c:293 [inline]
tlb_flush_mmu mm/mmu_gather.c:300 [inline]
tlb_finish_mmu+0x14b/0x6f0 mm/mmu_gather.c:392
exit_mmap+0x38b/0xa70 mm/mmap.c:3321
__mmput+0x12a/0x4d0 kernel/fork.c:1349
mmput+0x62/0x70 kernel/fork.c:1371
exit_mm kernel/exit.c:567 [inline]
do_exit+0x9ad/0x2ae0 kernel/exit.c:858
do_group_exit+0xd4/0x2a0 kernel/exit.c:1021
get_signal+0x23be/0x2790 kernel/signal.c:2904
arch_do_signal_or_restart+0x90/0x7f0 arch/x86/kernel/signal.c:309
exit_to_user_mode_loop kernel/entry/common.c:168 [inline]
exit_to_user_mode_prepare+0x121/0x240 kernel/entry/common.c:204
irqentry_exit_to_user_mode+0xa/0x40 kernel/entry/common.c:309
asm_sysvec_apic_timer_interrupt+0x1a/0x20 arch/x86/include/asm/idtentry.h:645
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
include/net/ip6_fib.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
index 1ba9f4ddf2f6db6c6ebf0a0675ca74fea2273fd9..e1e7a894863a7891610ce5afb2034473cc208d3e 100644
--- a/include/net/ip6_fib.h
+++ b/include/net/ip6_fib.h
@@ -328,8 +328,11 @@ static inline bool fib6_info_hold_safe(struct fib6_info *f6i)
static inline void fib6_info_release(struct fib6_info *f6i)
{
- if (f6i && refcount_dec_and_test(&f6i->fib6_ref))
+ if (f6i && refcount_dec_and_test(&f6i->fib6_ref)) {
+ DEBUG_NET_WARN_ON_ONCE(fib6_has_expires(f6i));
+ DEBUG_NET_WARN_ON_ONCE(!hlist_unhashed(&f6i->gc_link));
call_rcu(&f6i->rcu, fib6_info_destroy_rcu);
+ }
}
enum fib6_walk_state {
--
2.43.0.rc2.451.g8631bc7472-goog
^ permalink raw reply related [flat|nested] 22+ messages in thread* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-05 17:32 [PATCH net-next] ipv6: add debug checks in fib6_info_release() Eric Dumazet @ 2023-12-06 3:41 ` David Ahern 2023-12-07 3:10 ` patchwork-bot+netdevbpf 2023-12-07 23:02 ` Kui-Feng Lee 2 siblings, 0 replies; 22+ messages in thread From: David Ahern @ 2023-12-06 3:41 UTC (permalink / raw) To: Eric Dumazet, David S . Miller, Jakub Kicinski, Paolo Abeni Cc: netdev, eric.dumazet On 12/5/23 10:32 AM, Eric Dumazet wrote: > Some elusive syzbot reports are hinting to fib6_info_release(), > with a potential dangling f6i->gc_link anchor. > > Add debug checks so that syzbot can catch the issue earlier eventually. > > BUG: KASAN: slab-use-after-free in __hlist_del include/linux/list.h:990 [inline] > BUG: KASAN: slab-use-after-free in hlist_del_init include/linux/list.h:1016 [inline] > BUG: KASAN: slab-use-after-free in fib6_clean_expires_locked include/net/ip6_fib.h:533 [inline] > BUG: KASAN: slab-use-after-free in fib6_purge_rt+0x986/0x9c0 net/ipv6/ip6_fib.c:1064 > Write of size 8 at addr ffff88802805a840 by task syz-executor.1/10057 > ... > > Signed-off-by: Eric Dumazet <edumazet@google.com> > --- > include/net/ip6_fib.h | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > Reviewed-by: David Ahern <dsahern@kernel.org> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-05 17:32 [PATCH net-next] ipv6: add debug checks in fib6_info_release() Eric Dumazet 2023-12-06 3:41 ` David Ahern @ 2023-12-07 3:10 ` patchwork-bot+netdevbpf 2023-12-07 13:29 ` Eric Dumazet 2023-12-07 23:02 ` Kui-Feng Lee 2 siblings, 1 reply; 22+ messages in thread From: patchwork-bot+netdevbpf @ 2023-12-07 3:10 UTC (permalink / raw) To: Eric Dumazet; +Cc: davem, kuba, pabeni, dsahern, netdev, eric.dumazet Hello: This patch was applied to netdev/net-next.git (main) by Jakub Kicinski <kuba@kernel.org>: On Tue, 5 Dec 2023 17:32:50 +0000 you wrote: > Some elusive syzbot reports are hinting to fib6_info_release(), > with a potential dangling f6i->gc_link anchor. > > Add debug checks so that syzbot can catch the issue earlier eventually. > > BUG: KASAN: slab-use-after-free in __hlist_del include/linux/list.h:990 [inline] > BUG: KASAN: slab-use-after-free in hlist_del_init include/linux/list.h:1016 [inline] > BUG: KASAN: slab-use-after-free in fib6_clean_expires_locked include/net/ip6_fib.h:533 [inline] > BUG: KASAN: slab-use-after-free in fib6_purge_rt+0x986/0x9c0 net/ipv6/ip6_fib.c:1064 > Write of size 8 at addr ffff88802805a840 by task syz-executor.1/10057 > > [...] Here is the summary with links: - [net-next] ipv6: add debug checks in fib6_info_release() https://git.kernel.org/netdev/net-next/c/5a08d0065a91 You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 3:10 ` patchwork-bot+netdevbpf @ 2023-12-07 13:29 ` Eric Dumazet 2023-12-07 16:43 ` Kui-Feng Lee 2023-12-07 18:06 ` Kui-Feng Lee 0 siblings, 2 replies; 22+ messages in thread From: Eric Dumazet @ 2023-12-07 13:29 UTC (permalink / raw) To: patchwork-bot+netdevbpf, Kui-Feng Lee Cc: davem, kuba, pabeni, dsahern, netdev, eric.dumazet On Thu, Dec 7, 2023 at 4:10 AM <patchwork-bot+netdevbpf@kernel.org> wrote: > > Hello: > > This patch was applied to netdev/net-next.git (main) > by Jakub Kicinski <kuba@kernel.org>: > > On Tue, 5 Dec 2023 17:32:50 +0000 you wrote: > > Some elusive syzbot reports are hinting to fib6_info_release(), > > with a potential dangling f6i->gc_link anchor. > > > > Add debug checks so that syzbot can catch the issue earlier eventually. > > > > BUG: KASAN: slab-use-after-free in __hlist_del include/linux/list.h:990 [inline] > > BUG: KASAN: slab-use-after-free in hlist_del_init include/linux/list.h:1016 [inline] > > BUG: KASAN: slab-use-after-free in fib6_clean_expires_locked include/net/ip6_fib.h:533 [inline] > > BUG: KASAN: slab-use-after-free in fib6_purge_rt+0x986/0x9c0 net/ipv6/ip6_fib.c:1064 > > Write of size 8 at addr ffff88802805a840 by task syz-executor.1/10057 > > > > [...] > > Here is the summary with links: > - [net-next] ipv6: add debug checks in fib6_info_release() > https://git.kernel.org/netdev/net-next/c/5a08d0065a91 Nice, syzbot gave me exactly what I was looking for. WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 fib6_info_release include/net/ip6_fib.h:332 [inline] WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 Modules linked in: CPU: 0 PID: 5059 Comm: syz-executor256 Not tainted 6.7.0-rc3-syzkaller-00805-g5a08d0065a91 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/10/2023 RIP: 0010:fib6_info_release include/net/ip6_fib.h:332 [inline] RIP: 0010:ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 Code: 49 83 7f 40 00 75 28 e8 04 ae 50 f8 49 8d bf a0 00 00 00 48 c7 c6 c0 ae 37 89 e8 41 2c 3a f8 e9 65 f4 ff ff e8 e7 ad 50 f8 90 <0f> 0b 90 eb ad e8 dc ad 50 f8 90 0f 0b 90 eb cd e8 d1 ad 50 f8 e8 RSP: 0018:ffffc90003bdf8e0 EFLAGS: 00010293 RAX: 0000000000000000 RBX: 0000000000400000 RCX: ffffffff8936e418 RDX: ffff888026a58000 RSI: ffffffff8936e469 RDI: 0000000000000005 RBP: ffffc90003bdf9d0 R08: 0000000000000005 R09: 0000000000000000 R10: 0000000000400000 R11: ffffffff81de4c35 R12: ffffffffffffffea R13: ffff88802993242c R14: ffffc90003bdfac4 R15: ffff888029932400 FS: 00005555562b4380(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000004585c0 CR3: 000000007390d000 CR4: 00000000003506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> ip6_route_add+0x26/0x1f0 net/ipv6/route.c:3843 ipv6_route_ioctl+0x3ff/0x590 net/ipv6/route.c:4467 inet6_ioctl+0x265/0x2b0 net/ipv6/af_inet6.c:575 sock_do_ioctl+0x113/0x270 net/socket.c:1220 sock_ioctl+0x22e/0x6b0 net/socket.c:1339 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:871 [inline] __se_sys_ioctl fs/ioctl.c:857 [inline] __x64_sys_ioctl+0x18f/0x210 fs/ioctl.c:857 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 entry_SYSCALL_64_after_hwframe+0x63/0x6b RIP: 0033:0x7f175790d369 Following commit seems buggy. commit 3dec89b14d37ee635e772636dad3f09f78f1ab87 Author: Kui-Feng Lee <thinker.li@gmail.com> Date: Tue Aug 15 11:07:05 2023 -0700 net/ipv6: Remove expired routes with a separated list of routes. FIB6 GC walks trees of fib6_tables to remove expired routes. Walking a tree can be expensive if the number of routes in a table is big, even if most of them are permanent. Checking routes in a separated list of routes having expiration will avoid this potential issue. Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com> Reviewed-by: David Ahern <dsahern@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 13:29 ` Eric Dumazet @ 2023-12-07 16:43 ` Kui-Feng Lee 2023-12-07 18:06 ` Kui-Feng Lee 1 sibling, 0 replies; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-07 16:43 UTC (permalink / raw) To: Eric Dumazet, patchwork-bot+netdevbpf, Kui-Feng Lee Cc: davem, kuba, pabeni, dsahern, netdev, eric.dumazet On 12/7/23 05:29, Eric Dumazet wrote: > On Thu, Dec 7, 2023 at 4:10 AM <patchwork-bot+netdevbpf@kernel.org> wrote: >> >> Hello: >> >> This patch was applied to netdev/net-next.git (main) >> by Jakub Kicinski <kuba@kernel.org>: >> >> On Tue, 5 Dec 2023 17:32:50 +0000 you wrote: >>> Some elusive syzbot reports are hinting to fib6_info_release(), >>> with a potential dangling f6i->gc_link anchor. >>> >>> Add debug checks so that syzbot can catch the issue earlier eventually. >>> >>> BUG: KASAN: slab-use-after-free in __hlist_del include/linux/list.h:990 [inline] >>> BUG: KASAN: slab-use-after-free in hlist_del_init include/linux/list.h:1016 [inline] >>> BUG: KASAN: slab-use-after-free in fib6_clean_expires_locked include/net/ip6_fib.h:533 [inline] >>> BUG: KASAN: slab-use-after-free in fib6_purge_rt+0x986/0x9c0 net/ipv6/ip6_fib.c:1064 >>> Write of size 8 at addr ffff88802805a840 by task syz-executor.1/10057 >>> >>> [...] >> >> Here is the summary with links: >> - [net-next] ipv6: add debug checks in fib6_info_release() >> https://git.kernel.org/netdev/net-next/c/5a08d0065a91 > > Nice, syzbot gave me exactly what I was looking for. > > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > fib6_info_release include/net/ip6_fib.h:332 [inline] > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 > Modules linked in: > CPU: 0 PID: 5059 Comm: syz-executor256 Not tainted > 6.7.0-rc3-syzkaller-00805-g5a08d0065a91 #0 > Hardware name: Google Google Compute Engine/Google Compute Engine, > BIOS Google 11/10/2023 > RIP: 0010:fib6_info_release include/net/ip6_fib.h:332 [inline] > RIP: 0010:ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 > Code: 49 83 7f 40 00 75 28 e8 04 ae 50 f8 49 8d bf a0 00 00 00 48 c7 > c6 c0 ae 37 89 e8 41 2c 3a f8 e9 65 f4 ff ff e8 e7 ad 50 f8 90 <0f> 0b > 90 eb ad e8 dc ad 50 f8 90 0f 0b 90 eb cd e8 d1 ad 50 f8 e8 > RSP: 0018:ffffc90003bdf8e0 EFLAGS: 00010293 > RAX: 0000000000000000 RBX: 0000000000400000 RCX: ffffffff8936e418 > RDX: ffff888026a58000 RSI: ffffffff8936e469 RDI: 0000000000000005 > RBP: ffffc90003bdf9d0 R08: 0000000000000005 R09: 0000000000000000 > R10: 0000000000400000 R11: ffffffff81de4c35 R12: ffffffffffffffea > R13: ffff88802993242c R14: ffffc90003bdfac4 R15: ffff888029932400 > FS: 00005555562b4380(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: 00000000004585c0 CR3: 000000007390d000 CR4: 00000000003506f0 > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 > Call Trace: > <TASK> > ip6_route_add+0x26/0x1f0 net/ipv6/route.c:3843 > ipv6_route_ioctl+0x3ff/0x590 net/ipv6/route.c:4467 > inet6_ioctl+0x265/0x2b0 net/ipv6/af_inet6.c:575 > sock_do_ioctl+0x113/0x270 net/socket.c:1220 > sock_ioctl+0x22e/0x6b0 net/socket.c:1339 > vfs_ioctl fs/ioctl.c:51 [inline] > __do_sys_ioctl fs/ioctl.c:871 [inline] > __se_sys_ioctl fs/ioctl.c:857 [inline] > __x64_sys_ioctl+0x18f/0x210 fs/ioctl.c:857 > do_syscall_x64 arch/x86/entry/common.c:51 [inline] > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 > entry_SYSCALL_64_after_hwframe+0x63/0x6b > RIP: 0033:0x7f175790d369 > > > Following commit seems buggy. > > commit 3dec89b14d37ee635e772636dad3f09f78f1ab87 > Author: Kui-Feng Lee <thinker.li@gmail.com> > Date: Tue Aug 15 11:07:05 2023 -0700 > > net/ipv6: Remove expired routes with a separated list of routes. > > FIB6 GC walks trees of fib6_tables to remove expired routes. Walking a tree > can be expensive if the number of routes in a table is big, even if most of > them are permanent. Checking routes in a separated list of routes having > expiration will avoid this potential issue. > > Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com> > Reviewed-by: David Ahern <dsahern@kernel.org> > Signed-off-by: David S. Miller <davem@davemloft.net> > Thank you for raising my awareness! I will look into it. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 13:29 ` Eric Dumazet 2023-12-07 16:43 ` Kui-Feng Lee @ 2023-12-07 18:06 ` Kui-Feng Lee 2023-12-07 18:10 ` Eric Dumazet 1 sibling, 1 reply; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-07 18:06 UTC (permalink / raw) To: Eric Dumazet, patchwork-bot+netdevbpf, Kui-Feng Lee Cc: davem, kuba, pabeni, dsahern, netdev, eric.dumazet On 12/7/23 05:29, Eric Dumazet wrote: > On Thu, Dec 7, 2023 at 4:10 AM <patchwork-bot+netdevbpf@kernel.org> wrote: >> >> Hello: >> >> This patch was applied to netdev/net-next.git (main) >> by Jakub Kicinski <kuba@kernel.org>: >> >> On Tue, 5 Dec 2023 17:32:50 +0000 you wrote: >>> Some elusive syzbot reports are hinting to fib6_info_release(), >>> with a potential dangling f6i->gc_link anchor. >>> >>> Add debug checks so that syzbot can catch the issue earlier eventually. >>> >>> BUG: KASAN: slab-use-after-free in __hlist_del include/linux/list.h:990 [inline] >>> BUG: KASAN: slab-use-after-free in hlist_del_init include/linux/list.h:1016 [inline] >>> BUG: KASAN: slab-use-after-free in fib6_clean_expires_locked include/net/ip6_fib.h:533 [inline] >>> BUG: KASAN: slab-use-after-free in fib6_purge_rt+0x986/0x9c0 net/ipv6/ip6_fib.c:1064 >>> Write of size 8 at addr ffff88802805a840 by task syz-executor.1/10057 >>> >>> [...] >> >> Here is the summary with links: >> - [net-next] ipv6: add debug checks in fib6_info_release() >> https://git.kernel.org/netdev/net-next/c/5a08d0065a91 > > Nice, syzbot gave me exactly what I was looking for. > > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > fib6_info_release include/net/ip6_fib.h:332 [inline] > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 > Modules linked in: > CPU: 0 PID: 5059 Comm: syz-executor256 Not tainted > 6.7.0-rc3-syzkaller-00805-g5a08d0065a91 #0 > Hardware name: Google Google Compute Engine/Google Compute Engine, > BIOS Google 11/10/2023 > RIP: 0010:fib6_info_release include/net/ip6_fib.h:332 [inline] > RIP: 0010:ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 > Code: 49 83 7f 40 00 75 28 e8 04 ae 50 f8 49 8d bf a0 00 00 00 48 c7 > c6 c0 ae 37 89 e8 41 2c 3a f8 e9 65 f4 ff ff e8 e7 ad 50 f8 90 <0f> 0b > 90 eb ad e8 dc ad 50 f8 90 0f 0b 90 eb cd e8 d1 ad 50 f8 e8 > RSP: 0018:ffffc90003bdf8e0 EFLAGS: 00010293 > RAX: 0000000000000000 RBX: 0000000000400000 RCX: ffffffff8936e418 > RDX: ffff888026a58000 RSI: ffffffff8936e469 RDI: 0000000000000005 > RBP: ffffc90003bdf9d0 R08: 0000000000000005 R09: 0000000000000000 > R10: 0000000000400000 R11: ffffffff81de4c35 R12: ffffffffffffffea > R13: ffff88802993242c R14: ffffc90003bdfac4 R15: ffff888029932400 > FS: 00005555562b4380(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: 00000000004585c0 CR3: 000000007390d000 CR4: 00000000003506f0 > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 > Call Trace: > <TASK> > ip6_route_add+0x26/0x1f0 net/ipv6/route.c:3843 > ipv6_route_ioctl+0x3ff/0x590 net/ipv6/route.c:4467 > inet6_ioctl+0x265/0x2b0 net/ipv6/af_inet6.c:575 > sock_do_ioctl+0x113/0x270 net/socket.c:1220 > sock_ioctl+0x22e/0x6b0 net/socket.c:1339 > vfs_ioctl fs/ioctl.c:51 [inline] > __do_sys_ioctl fs/ioctl.c:871 [inline] > __se_sys_ioctl fs/ioctl.c:857 [inline] > __x64_sys_ioctl+0x18f/0x210 fs/ioctl.c:857 > do_syscall_x64 arch/x86/entry/common.c:51 [inline] > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 > entry_SYSCALL_64_after_hwframe+0x63/0x6b > RIP: 0033:0x7f175790d369 > > > Following commit seems buggy. > > commit 3dec89b14d37ee635e772636dad3f09f78f1ab87 > Author: Kui-Feng Lee <thinker.li@gmail.com> > Date: Tue Aug 15 11:07:05 2023 -0700 > > net/ipv6: Remove expired routes with a separated list of routes. > > FIB6 GC walks trees of fib6_tables to remove expired routes. Walking a tree > can be expensive if the number of routes in a table is big, even if most of > them are permanent. Checking routes in a separated list of routes having > expiration will avoid this potential issue. > > Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com> > Reviewed-by: David Ahern <dsahern@kernel.org> > Signed-off-by: David S. Miller <davem@davemloft.net> > Do you happen to have a test program that can reproduce it? ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:06 ` Kui-Feng Lee @ 2023-12-07 18:10 ` Eric Dumazet 2023-12-07 18:19 ` Kui-Feng Lee 0 siblings, 1 reply; 22+ messages in thread From: Eric Dumazet @ 2023-12-07 18:10 UTC (permalink / raw) To: Kui-Feng Lee Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, dsahern, netdev, eric.dumazet On Thu, Dec 7, 2023 at 7:06 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > Do you happen to have a test program that can reproduce it? syzbot has a repro, let me release the bug. Of course syzbot bisection points to my last patch. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:10 ` Eric Dumazet @ 2023-12-07 18:19 ` Kui-Feng Lee 2023-12-07 18:22 ` Eric Dumazet 0 siblings, 1 reply; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-07 18:19 UTC (permalink / raw) To: Eric Dumazet Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, dsahern, netdev, eric.dumazet On 12/7/23 10:10, Eric Dumazet wrote: > On Thu, Dec 7, 2023 at 7:06 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > >> Do you happen to have a test program that can reproduce it? > > syzbot has a repro, let me release the bug. > > Of course syzbot bisection points to my last patch. I just looked into the code. The origin issue mentioned at the thread head should be something related to a GC change I made. But, the warnings you added doesn't catch the the error correctly. According to your stacktrace > ip6_route_add+0x26/0x1f0 net/ipv6/route.c:3843 > ipv6_route_ioctl+0x3ff/0x590 net/ipv6/route.c:4467 > inet6_ioctl+0x265/0x2b0 net/ipv6/af_inet6.c:575 > sock_do_ioctl+0x113/0x270 net/socket.c:1220 > sock_ioctl+0x22e/0x6b0 net/socket.c:1339 > vfs_ioctl fs/ioctl.c:51 [inline] > __do_sys_ioctl fs/ioctl.c:871 [inline] > __se_sys_ioctl fs/ioctl.c:857 [inline] > __x64_sys_ioctl+0x18f/0x210 fs/ioctl.c:857 > do_syscall_x64 arch/x86/entry/common.c:51 [inline] > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 > entry_SYSCALL_64_after_hwframe+0x63/0x6b and warning messages you provided > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > fib6_info_release include/net/ip6_fib.h:332 [inline] > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 It takes place in ip6_route_info_create() to do error handling. It can be fib6_has_expires() in fib6_info_release() in this case. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:19 ` Kui-Feng Lee @ 2023-12-07 18:22 ` Eric Dumazet 2023-12-07 18:25 ` David Ahern 2023-12-07 18:46 ` Kui-Feng Lee 0 siblings, 2 replies; 22+ messages in thread From: Eric Dumazet @ 2023-12-07 18:22 UTC (permalink / raw) To: Kui-Feng Lee Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, dsahern, netdev, eric.dumazet On Thu, Dec 7, 2023 at 7:19 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > > > > On 12/7/23 10:10, Eric Dumazet wrote: > > On Thu, Dec 7, 2023 at 7:06 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > > > >> Do you happen to have a test program that can reproduce it? > > > > syzbot has a repro, let me release the bug. > > > > Of course syzbot bisection points to my last patch. > > I just looked into the code. > The origin issue mentioned at the thread head should be something > related to a GC change I made. But, the warnings you added doesn't > catch the the error correctly. According to your stacktrace > > > > ip6_route_add+0x26/0x1f0 net/ipv6/route.c:3843 > > ipv6_route_ioctl+0x3ff/0x590 net/ipv6/route.c:4467 > > inet6_ioctl+0x265/0x2b0 net/ipv6/af_inet6.c:575 > > sock_do_ioctl+0x113/0x270 net/socket.c:1220 > > sock_ioctl+0x22e/0x6b0 net/socket.c:1339 > > vfs_ioctl fs/ioctl.c:51 [inline] > > __do_sys_ioctl fs/ioctl.c:871 [inline] > > __se_sys_ioctl fs/ioctl.c:857 [inline] > > __x64_sys_ioctl+0x18f/0x210 fs/ioctl.c:857 > > do_syscall_x64 arch/x86/entry/common.c:51 [inline] > > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 > > entry_SYSCALL_64_after_hwframe+0x63/0x6b > > and warning messages you provided > > > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > > fib6_info_release include/net/ip6_fib.h:332 [inline] > > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > > ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 > > It takes place in ip6_route_info_create() to do error handling. > It can be fib6_has_expires() in fib6_info_release() in this case. Feel free to amend the patch, but the issue is that we insert a fib gc_link to a list, then free the fi6 object without removing it first from the external list. I added two different warnings, and removing one or both will still keep the bug. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:22 ` Eric Dumazet @ 2023-12-07 18:25 ` David Ahern 2023-12-07 18:26 ` David Ahern 2023-12-07 18:36 ` Kui-Feng Lee 2023-12-07 18:46 ` Kui-Feng Lee 1 sibling, 2 replies; 22+ messages in thread From: David Ahern @ 2023-12-07 18:25 UTC (permalink / raw) To: Eric Dumazet, Kui-Feng Lee Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, netdev, eric.dumazet On 12/7/23 11:22 AM, Eric Dumazet wrote: > Feel free to amend the patch, but the issue is that we insert a fib > gc_link to a list, then free the fi6 object without removing it first > from the external list. yes, move the insert down: diff --git a/net/ipv6/route.c b/net/ipv6/route.c index b132feae3393..7257ba0e72b7 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -3762,12 +3762,6 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, if (cfg->fc_flags & RTF_ADDRCONF) rt->dst_nocount = true; - if (cfg->fc_flags & RTF_EXPIRES) - fib6_set_expires_locked(rt, jiffies + - clock_t_to_jiffies(cfg->fc_expires)); - else - fib6_clean_expires_locked(rt); - if (cfg->fc_protocol == RTPROT_UNSPEC) cfg->fc_protocol = RTPROT_BOOT; rt->fib6_protocol = cfg->fc_protocol; @@ -3824,6 +3818,12 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, } else rt->fib6_prefsrc.plen = 0; + + if (cfg->fc_flags & RTF_EXPIRES) + fib6_set_expires_locked(rt, jiffies + + clock_t_to_jiffies(cfg->fc_expires)); + else + fib6_clean_expires_locked(rt); return rt; out: fib6_info_release(rt); ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:25 ` David Ahern @ 2023-12-07 18:26 ` David Ahern 2023-12-07 18:36 ` Kui-Feng Lee 1 sibling, 0 replies; 22+ messages in thread From: David Ahern @ 2023-12-07 18:26 UTC (permalink / raw) To: Eric Dumazet, Kui-Feng Lee Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, netdev, eric.dumazet On 12/7/23 11:25 AM, David Ahern wrote: > On 12/7/23 11:22 AM, Eric Dumazet wrote: >> Feel free to amend the patch, but the issue is that we insert a fib >> gc_link to a list, then free the fi6 object without removing it first >> from the external list. > > yes, move the insert down: > > diff --git a/net/ipv6/route.c b/net/ipv6/route.c > index b132feae3393..7257ba0e72b7 100644 > --- a/net/ipv6/route.c > +++ b/net/ipv6/route.c > @@ -3762,12 +3762,6 @@ static struct fib6_info > *ip6_route_info_create(struct fib6_config *cfg, > if (cfg->fc_flags & RTF_ADDRCONF) > rt->dst_nocount = true; > > - if (cfg->fc_flags & RTF_EXPIRES) > - fib6_set_expires_locked(rt, jiffies + > - > clock_t_to_jiffies(cfg->fc_expires)); > - else > - fib6_clean_expires_locked(rt); > - > if (cfg->fc_protocol == RTPROT_UNSPEC) > cfg->fc_protocol = RTPROT_BOOT; > rt->fib6_protocol = cfg->fc_protocol; > @@ -3824,6 +3818,12 @@ static struct fib6_info > *ip6_route_info_create(struct fib6_config *cfg, > } else > rt->fib6_prefsrc.plen = 0; > > + > + if (cfg->fc_flags & RTF_EXPIRES) > + fib6_set_expires_locked(rt, jiffies + > + > clock_t_to_jiffies(cfg->fc_expires)); > + else > + fib6_clean_expires_locked(rt); > return rt; > out: > fib6_info_release(rt); and then failure to insert into the table needs to remove it before the release too. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:25 ` David Ahern 2023-12-07 18:26 ` David Ahern @ 2023-12-07 18:36 ` Kui-Feng Lee 2023-12-07 18:40 ` Kui-Feng Lee 1 sibling, 1 reply; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-07 18:36 UTC (permalink / raw) To: David Ahern, Eric Dumazet Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, netdev, eric.dumazet On 12/7/23 10:25, David Ahern wrote: > On 12/7/23 11:22 AM, Eric Dumazet wrote: >> Feel free to amend the patch, but the issue is that we insert a fib >> gc_link to a list, then free the fi6 object without removing it first >> from the external list. > > yes, move the insert down: > > diff --git a/net/ipv6/route.c b/net/ipv6/route.c > index b132feae3393..7257ba0e72b7 100644 > --- a/net/ipv6/route.c > +++ b/net/ipv6/route.c > @@ -3762,12 +3762,6 @@ static struct fib6_info > *ip6_route_info_create(struct fib6_config *cfg, > if (cfg->fc_flags & RTF_ADDRCONF) > rt->dst_nocount = true; > > - if (cfg->fc_flags & RTF_EXPIRES) > - fib6_set_expires_locked(rt, jiffies + > - > clock_t_to_jiffies(cfg->fc_expires)); > - else > - fib6_clean_expires_locked(rt); > - fib6_set_expires_locked() here actually doesn't insert a fib gc_link since rt->fib6_table is not assigned yet. The gc_link will be inserted by fib6_add() being called later. > if (cfg->fc_protocol == RTPROT_UNSPEC) > cfg->fc_protocol = RTPROT_BOOT; > rt->fib6_protocol = cfg->fc_protocol; > @@ -3824,6 +3818,12 @@ static struct fib6_info > *ip6_route_info_create(struct fib6_config *cfg, > } else > rt->fib6_prefsrc.plen = 0; > > + > + if (cfg->fc_flags & RTF_EXPIRES) > + fib6_set_expires_locked(rt, jiffies + > + > clock_t_to_jiffies(cfg->fc_expires)); > + else > + fib6_clean_expires_locked(rt); > return rt; > out: > fib6_info_release(rt); However, this should fix the warning messages. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:36 ` Kui-Feng Lee @ 2023-12-07 18:40 ` Kui-Feng Lee 2023-12-07 19:00 ` Kui-Feng Lee 0 siblings, 1 reply; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-07 18:40 UTC (permalink / raw) To: David Ahern, Eric Dumazet Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, netdev, eric.dumazet On 12/7/23 10:36, Kui-Feng Lee wrote: > > > On 12/7/23 10:25, David Ahern wrote: >> On 12/7/23 11:22 AM, Eric Dumazet wrote: >>> Feel free to amend the patch, but the issue is that we insert a fib >>> gc_link to a list, then free the fi6 object without removing it first >>> from the external list. >> >> yes, move the insert down: >> >> diff --git a/net/ipv6/route.c b/net/ipv6/route.c >> index b132feae3393..7257ba0e72b7 100644 >> --- a/net/ipv6/route.c >> +++ b/net/ipv6/route.c >> @@ -3762,12 +3762,6 @@ static struct fib6_info >> *ip6_route_info_create(struct fib6_config *cfg, >> if (cfg->fc_flags & RTF_ADDRCONF) >> rt->dst_nocount = true; >> >> - if (cfg->fc_flags & RTF_EXPIRES) >> - fib6_set_expires_locked(rt, jiffies + >> - >> clock_t_to_jiffies(cfg->fc_expires)); >> - else >> - fib6_clean_expires_locked(rt); >> - > > fib6_set_expires_locked() here actually doesn't insert a fib gc_link > since rt->fib6_table is not assigned yet. The gc_link will > be inserted by fib6_add() being called later. > > >> if (cfg->fc_protocol == RTPROT_UNSPEC) >> cfg->fc_protocol = RTPROT_BOOT; >> rt->fib6_protocol = cfg->fc_protocol; >> @@ -3824,6 +3818,12 @@ static struct fib6_info >> *ip6_route_info_create(struct fib6_config *cfg, >> } else >> rt->fib6_prefsrc.plen = 0; >> >> + >> + if (cfg->fc_flags & RTF_EXPIRES) >> + fib6_set_expires_locked(rt, jiffies + >> + >> clock_t_to_jiffies(cfg->fc_expires)); >> + else >> + fib6_clean_expires_locked(rt); >> return rt; >> out: >> fib6_info_release(rt); > > However, this should fix the warning messages. Just realize this cause inserting the gc_link twice. fib6_add() will try to add it again! ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:40 ` Kui-Feng Lee @ 2023-12-07 19:00 ` Kui-Feng Lee 2023-12-07 19:05 ` Eric Dumazet 0 siblings, 1 reply; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-07 19:00 UTC (permalink / raw) To: David Ahern, Eric Dumazet Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, netdev, eric.dumazet On 12/7/23 10:40, Kui-Feng Lee wrote: > > > On 12/7/23 10:36, Kui-Feng Lee wrote: >> >> >> On 12/7/23 10:25, David Ahern wrote: >>> On 12/7/23 11:22 AM, Eric Dumazet wrote: >>>> Feel free to amend the patch, but the issue is that we insert a fib >>>> gc_link to a list, then free the fi6 object without removing it first >>>> from the external list. >>> >>> yes, move the insert down: >>> >>> diff --git a/net/ipv6/route.c b/net/ipv6/route.c >>> index b132feae3393..7257ba0e72b7 100644 >>> --- a/net/ipv6/route.c >>> +++ b/net/ipv6/route.c >>> @@ -3762,12 +3762,6 @@ static struct fib6_info >>> *ip6_route_info_create(struct fib6_config *cfg, >>> if (cfg->fc_flags & RTF_ADDRCONF) >>> rt->dst_nocount = true; >>> >>> - if (cfg->fc_flags & RTF_EXPIRES) >>> - fib6_set_expires_locked(rt, jiffies + >>> - >>> clock_t_to_jiffies(cfg->fc_expires)); >>> - else >>> - fib6_clean_expires_locked(rt); >>> - >> >> fib6_set_expires_locked() here actually doesn't insert a fib gc_link >> since rt->fib6_table is not assigned yet. The gc_link will >> be inserted by fib6_add() being called later. >> >> >>> if (cfg->fc_protocol == RTPROT_UNSPEC) >>> cfg->fc_protocol = RTPROT_BOOT; >>> rt->fib6_protocol = cfg->fc_protocol; >>> @@ -3824,6 +3818,12 @@ static struct fib6_info >>> *ip6_route_info_create(struct fib6_config *cfg, >>> } else >>> rt->fib6_prefsrc.plen = 0; >>> >>> + >>> + if (cfg->fc_flags & RTF_EXPIRES) >>> + fib6_set_expires_locked(rt, jiffies + >>> + >>> clock_t_to_jiffies(cfg->fc_expires)); >>> + else >>> + fib6_clean_expires_locked(rt); >>> return rt; >>> out: >>> fib6_info_release(rt); >> >> However, this should fix the warning messages. > Just realize this cause inserting the gc_link twice. fib6_add() > will try to add it again! I made a minor change to the patch that fix warning messages provided by David Ahern. Will send an official patch later. --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -3762,17 +3762,10 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, if (cfg->fc_flags & RTF_ADDRCONF) rt->dst_nocount = true; - if (cfg->fc_flags & RTF_EXPIRES) - fib6_set_expires_locked(rt, jiffies + - clock_t_to_jiffies(cfg->fc_expires)); - else - fib6_clean_expires_locked(rt); - if (cfg->fc_protocol == RTPROT_UNSPEC) cfg->fc_protocol = RTPROT_BOOT; rt->fib6_protocol = cfg->fc_protocol; - rt->fib6_table = table; rt->fib6_metric = cfg->fc_metric; rt->fib6_type = cfg->fc_type ? : RTN_UNICAST; rt->fib6_flags = cfg->fc_flags & ~RTF_GATEWAY; @@ -3824,6 +3817,17 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg, } else rt->fib6_prefsrc.plen = 0; + if (cfg->fc_flags & RTF_EXPIRES) + fib6_set_expires_locked(rt, jiffies + + clock_t_to_jiffies(cfg->fc_expires)); + else + fib6_clean_expires_locked(rt); + /* Set fib6_table after fib6_set_expires_locked() to ensure the + * gc_link is not inserted until fib6_add() is called to insert the + * fib6_info to the fib. + */ + rt->fib6_table = table; + return rt; out: ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 19:00 ` Kui-Feng Lee @ 2023-12-07 19:05 ` Eric Dumazet 2023-12-07 19:08 ` Kui-Feng Lee 0 siblings, 1 reply; 22+ messages in thread From: Eric Dumazet @ 2023-12-07 19:05 UTC (permalink / raw) To: Kui-Feng Lee Cc: David Ahern, patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, netdev, eric.dumazet On Thu, Dec 7, 2023 at 8:00 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > > > > On 12/7/23 10:40, Kui-Feng Lee wrote: > > > > > > On 12/7/23 10:36, Kui-Feng Lee wrote: > >> > >> > >> On 12/7/23 10:25, David Ahern wrote: > >>> On 12/7/23 11:22 AM, Eric Dumazet wrote: > >>>> Feel free to amend the patch, but the issue is that we insert a fib > >>>> gc_link to a list, then free the fi6 object without removing it first > >>>> from the external list. > >>> > >>> yes, move the insert down: > >>> > >>> diff --git a/net/ipv6/route.c b/net/ipv6/route.c > >>> index b132feae3393..7257ba0e72b7 100644 > >>> --- a/net/ipv6/route.c > >>> +++ b/net/ipv6/route.c > >>> @@ -3762,12 +3762,6 @@ static struct fib6_info > >>> *ip6_route_info_create(struct fib6_config *cfg, > >>> if (cfg->fc_flags & RTF_ADDRCONF) > >>> rt->dst_nocount = true; > >>> > >>> - if (cfg->fc_flags & RTF_EXPIRES) > >>> - fib6_set_expires_locked(rt, jiffies + > >>> - > >>> clock_t_to_jiffies(cfg->fc_expires)); > >>> - else > >>> - fib6_clean_expires_locked(rt); > >>> - > >> > >> fib6_set_expires_locked() here actually doesn't insert a fib gc_link > >> since rt->fib6_table is not assigned yet. The gc_link will > >> be inserted by fib6_add() being called later. > >> > >> > >>> if (cfg->fc_protocol == RTPROT_UNSPEC) > >>> cfg->fc_protocol = RTPROT_BOOT; > >>> rt->fib6_protocol = cfg->fc_protocol; > >>> @@ -3824,6 +3818,12 @@ static struct fib6_info > >>> *ip6_route_info_create(struct fib6_config *cfg, > >>> } else > >>> rt->fib6_prefsrc.plen = 0; > >>> > >>> + > >>> + if (cfg->fc_flags & RTF_EXPIRES) > >>> + fib6_set_expires_locked(rt, jiffies + > >>> + > >>> clock_t_to_jiffies(cfg->fc_expires)); > >>> + else > >>> + fib6_clean_expires_locked(rt); > >>> return rt; > >>> out: > >>> fib6_info_release(rt); > >> > >> However, this should fix the warning messages. > > Just realize this cause inserting the gc_link twice. fib6_add() > > will try to add it again! > > I made a minor change to the patch that fix warning messages > provided by David Ahern. Will send an official patch later. > > --- a/net/ipv6/route.c > +++ b/net/ipv6/route.c > @@ -3762,17 +3762,10 @@ static struct fib6_info > *ip6_route_info_create(struct fib6_config *cfg, > if (cfg->fc_flags & RTF_ADDRCONF) > rt->dst_nocount = true; > > - if (cfg->fc_flags & RTF_EXPIRES) > - fib6_set_expires_locked(rt, jiffies + > - > clock_t_to_jiffies(cfg->fc_expires)); > - else > - fib6_clean_expires_locked(rt); > - > if (cfg->fc_protocol == RTPROT_UNSPEC) > cfg->fc_protocol = RTPROT_BOOT; > rt->fib6_protocol = cfg->fc_protocol; > > - rt->fib6_table = table; > rt->fib6_metric = cfg->fc_metric; > rt->fib6_type = cfg->fc_type ? : RTN_UNICAST; > rt->fib6_flags = cfg->fc_flags & ~RTF_GATEWAY; > @@ -3824,6 +3817,17 @@ static struct fib6_info > *ip6_route_info_create(struct fib6_config *cfg, > } else > rt->fib6_prefsrc.plen = 0; > > + if (cfg->fc_flags & RTF_EXPIRES) > + fib6_set_expires_locked(rt, jiffies + > + > clock_t_to_jiffies(cfg->fc_expires)); > + else > + fib6_clean_expires_locked(rt); Note that I do not see why we call fib6_clean_expires_locked() on a freshly allocated object. f6i->expires should already be zero... > + /* Set fib6_table after fib6_set_expires_locked() to ensure the > + * gc_link is not inserted until fib6_add() is called to insert the > + * fib6_info to the fib. > + */ > + rt->fib6_table = table; > + > return rt; > out: ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 19:05 ` Eric Dumazet @ 2023-12-07 19:08 ` Kui-Feng Lee 2023-12-07 19:14 ` Eric Dumazet 0 siblings, 1 reply; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-07 19:08 UTC (permalink / raw) To: Eric Dumazet Cc: David Ahern, patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, netdev, eric.dumazet On 12/7/23 11:05, Eric Dumazet wrote: > On Thu, Dec 7, 2023 at 8:00 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: >> >> >> >> On 12/7/23 10:40, Kui-Feng Lee wrote: >>> >>> >>> On 12/7/23 10:36, Kui-Feng Lee wrote: >>>> >>>> >>>> On 12/7/23 10:25, David Ahern wrote: >>>>> On 12/7/23 11:22 AM, Eric Dumazet wrote: >>>>>> Feel free to amend the patch, but the issue is that we insert a fib >>>>>> gc_link to a list, then free the fi6 object without removing it first >>>>>> from the external list. >>>>> >>>>> yes, move the insert down: >>>>> >>>>> diff --git a/net/ipv6/route.c b/net/ipv6/route.c >>>>> index b132feae3393..7257ba0e72b7 100644 >>>>> --- a/net/ipv6/route.c >>>>> +++ b/net/ipv6/route.c >>>>> @@ -3762,12 +3762,6 @@ static struct fib6_info >>>>> *ip6_route_info_create(struct fib6_config *cfg, >>>>> if (cfg->fc_flags & RTF_ADDRCONF) >>>>> rt->dst_nocount = true; >>>>> >>>>> - if (cfg->fc_flags & RTF_EXPIRES) >>>>> - fib6_set_expires_locked(rt, jiffies + >>>>> - >>>>> clock_t_to_jiffies(cfg->fc_expires)); >>>>> - else >>>>> - fib6_clean_expires_locked(rt); >>>>> - >>>> >>>> fib6_set_expires_locked() here actually doesn't insert a fib gc_link >>>> since rt->fib6_table is not assigned yet. The gc_link will >>>> be inserted by fib6_add() being called later. >>>> >>>> >>>>> if (cfg->fc_protocol == RTPROT_UNSPEC) >>>>> cfg->fc_protocol = RTPROT_BOOT; >>>>> rt->fib6_protocol = cfg->fc_protocol; >>>>> @@ -3824,6 +3818,12 @@ static struct fib6_info >>>>> *ip6_route_info_create(struct fib6_config *cfg, >>>>> } else >>>>> rt->fib6_prefsrc.plen = 0; >>>>> >>>>> + >>>>> + if (cfg->fc_flags & RTF_EXPIRES) >>>>> + fib6_set_expires_locked(rt, jiffies + >>>>> + >>>>> clock_t_to_jiffies(cfg->fc_expires)); >>>>> + else >>>>> + fib6_clean_expires_locked(rt); >>>>> return rt; >>>>> out: >>>>> fib6_info_release(rt); >>>> >>>> However, this should fix the warning messages. >>> Just realize this cause inserting the gc_link twice. fib6_add() >>> will try to add it again! >> >> I made a minor change to the patch that fix warning messages >> provided by David Ahern. Will send an official patch later. >> >> --- a/net/ipv6/route.c >> +++ b/net/ipv6/route.c >> @@ -3762,17 +3762,10 @@ static struct fib6_info >> *ip6_route_info_create(struct fib6_config *cfg, >> if (cfg->fc_flags & RTF_ADDRCONF) >> rt->dst_nocount = true; >> >> - if (cfg->fc_flags & RTF_EXPIRES) >> - fib6_set_expires_locked(rt, jiffies + >> - >> clock_t_to_jiffies(cfg->fc_expires)); >> - else >> - fib6_clean_expires_locked(rt); >> - >> if (cfg->fc_protocol == RTPROT_UNSPEC) >> cfg->fc_protocol = RTPROT_BOOT; >> rt->fib6_protocol = cfg->fc_protocol; >> >> - rt->fib6_table = table; >> rt->fib6_metric = cfg->fc_metric; >> rt->fib6_type = cfg->fc_type ? : RTN_UNICAST; >> rt->fib6_flags = cfg->fc_flags & ~RTF_GATEWAY; >> @@ -3824,6 +3817,17 @@ static struct fib6_info >> *ip6_route_info_create(struct fib6_config *cfg, >> } else >> rt->fib6_prefsrc.plen = 0; >> >> + if (cfg->fc_flags & RTF_EXPIRES) >> + fib6_set_expires_locked(rt, jiffies + >> + >> clock_t_to_jiffies(cfg->fc_expires)); >> + else >> + fib6_clean_expires_locked(rt); > > Note that I do not see why we call fib6_clean_expires_locked() on a > freshly allocated object. > > f6i->expires should already be zero... > Agree! I will remove it as well. >> + /* Set fib6_table after fib6_set_expires_locked() to ensure the >> + * gc_link is not inserted until fib6_add() is called to insert the >> + * fib6_info to the fib. >> + */ >> + rt->fib6_table = table; >> + >> return rt; >> out: ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 19:08 ` Kui-Feng Lee @ 2023-12-07 19:14 ` Eric Dumazet 0 siblings, 0 replies; 22+ messages in thread From: Eric Dumazet @ 2023-12-07 19:14 UTC (permalink / raw) To: Kui-Feng Lee Cc: David Ahern, patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, netdev, eric.dumazet On Thu, Dec 7, 2023 at 8:08 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > > > > On 12/7/23 11:05, Eric Dumazet wrote: > > On Thu, Dec 7, 2023 at 8:00 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > >> > >> > >> > >> On 12/7/23 10:40, Kui-Feng Lee wrote: > >>> > >>> > >>> On 12/7/23 10:36, Kui-Feng Lee wrote: > >>>> > >>>> > >>>> On 12/7/23 10:25, David Ahern wrote: > >>>>> On 12/7/23 11:22 AM, Eric Dumazet wrote: > >>>>>> Feel free to amend the patch, but the issue is that we insert a fib > >>>>>> gc_link to a list, then free the fi6 object without removing it first > >>>>>> from the external list. > >>>>> > >>>>> yes, move the insert down: > >>>>> > >>>>> diff --git a/net/ipv6/route.c b/net/ipv6/route.c > >>>>> index b132feae3393..7257ba0e72b7 100644 > >>>>> --- a/net/ipv6/route.c > >>>>> +++ b/net/ipv6/route.c > >>>>> @@ -3762,12 +3762,6 @@ static struct fib6_info > >>>>> *ip6_route_info_create(struct fib6_config *cfg, > >>>>> if (cfg->fc_flags & RTF_ADDRCONF) > >>>>> rt->dst_nocount = true; > >>>>> > >>>>> - if (cfg->fc_flags & RTF_EXPIRES) > >>>>> - fib6_set_expires_locked(rt, jiffies + > >>>>> - > >>>>> clock_t_to_jiffies(cfg->fc_expires)); > >>>>> - else > >>>>> - fib6_clean_expires_locked(rt); > >>>>> - > >>>> > >>>> fib6_set_expires_locked() here actually doesn't insert a fib gc_link > >>>> since rt->fib6_table is not assigned yet. The gc_link will > >>>> be inserted by fib6_add() being called later. > >>>> > >>>> > >>>>> if (cfg->fc_protocol == RTPROT_UNSPEC) > >>>>> cfg->fc_protocol = RTPROT_BOOT; > >>>>> rt->fib6_protocol = cfg->fc_protocol; > >>>>> @@ -3824,6 +3818,12 @@ static struct fib6_info > >>>>> *ip6_route_info_create(struct fib6_config *cfg, > >>>>> } else > >>>>> rt->fib6_prefsrc.plen = 0; > >>>>> > >>>>> + > >>>>> + if (cfg->fc_flags & RTF_EXPIRES) > >>>>> + fib6_set_expires_locked(rt, jiffies + > >>>>> + > >>>>> clock_t_to_jiffies(cfg->fc_expires)); > >>>>> + else > >>>>> + fib6_clean_expires_locked(rt); > >>>>> return rt; > >>>>> out: > >>>>> fib6_info_release(rt); > >>>> > >>>> However, this should fix the warning messages. > >>> Just realize this cause inserting the gc_link twice. fib6_add() > >>> will try to add it again! > >> > >> I made a minor change to the patch that fix warning messages > >> provided by David Ahern. Will send an official patch later. > >> > >> --- a/net/ipv6/route.c > >> +++ b/net/ipv6/route.c > >> @@ -3762,17 +3762,10 @@ static struct fib6_info > >> *ip6_route_info_create(struct fib6_config *cfg, > >> if (cfg->fc_flags & RTF_ADDRCONF) > >> rt->dst_nocount = true; > >> > >> - if (cfg->fc_flags & RTF_EXPIRES) > >> - fib6_set_expires_locked(rt, jiffies + > >> - > >> clock_t_to_jiffies(cfg->fc_expires)); > >> - else > >> - fib6_clean_expires_locked(rt); > >> - > >> if (cfg->fc_protocol == RTPROT_UNSPEC) > >> cfg->fc_protocol = RTPROT_BOOT; > >> rt->fib6_protocol = cfg->fc_protocol; > >> > >> - rt->fib6_table = table; > >> rt->fib6_metric = cfg->fc_metric; > >> rt->fib6_type = cfg->fc_type ? : RTN_UNICAST; > >> rt->fib6_flags = cfg->fc_flags & ~RTF_GATEWAY; > >> @@ -3824,6 +3817,17 @@ static struct fib6_info > >> *ip6_route_info_create(struct fib6_config *cfg, > >> } else > >> rt->fib6_prefsrc.plen = 0; > >> > >> + if (cfg->fc_flags & RTF_EXPIRES) > >> + fib6_set_expires_locked(rt, jiffies + > >> + > >> clock_t_to_jiffies(cfg->fc_expires)); > >> + else > >> + fib6_clean_expires_locked(rt); > > > > Note that I do not see why we call fib6_clean_expires_locked() on a > > freshly allocated object. > > > > f6i->expires should already be zero... > > > > Agree! I will remove it as well. Please also add the following, if really we keep fib6_has_expires() current definition. diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index e1e7a894863a7891610ce5afb2034473cc208d3e..95ed495c3a4028457baf1503c367d2e7a6e14770 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -329,7 +329,6 @@ static inline bool fib6_info_hold_safe(struct fib6_info *f6i) static inline void fib6_info_release(struct fib6_info *f6i) { if (f6i && refcount_dec_and_test(&f6i->fib6_ref)) { - DEBUG_NET_WARN_ON_ONCE(fib6_has_expires(f6i)); DEBUG_NET_WARN_ON_ONCE(!hlist_unhashed(&f6i->gc_link)); call_rcu(&f6i->rcu, fib6_info_destroy_rcu); } ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:22 ` Eric Dumazet 2023-12-07 18:25 ` David Ahern @ 2023-12-07 18:46 ` Kui-Feng Lee 2023-12-07 18:55 ` Eric Dumazet 1 sibling, 1 reply; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-07 18:46 UTC (permalink / raw) To: Eric Dumazet Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, dsahern, netdev, eric.dumazet On 12/7/23 10:22, Eric Dumazet wrote: > On Thu, Dec 7, 2023 at 7:19 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: >> >> >> >> On 12/7/23 10:10, Eric Dumazet wrote: >>> On Thu, Dec 7, 2023 at 7:06 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: >>> >>>> Do you happen to have a test program that can reproduce it? >>> >>> syzbot has a repro, let me release the bug. >>> >>> Of course syzbot bisection points to my last patch. >> >> I just looked into the code. >> The origin issue mentioned at the thread head should be something >> related to a GC change I made. But, the warnings you added doesn't >> catch the the error correctly. According to your stacktrace >> >> >> > ip6_route_add+0x26/0x1f0 net/ipv6/route.c:3843 >> > ipv6_route_ioctl+0x3ff/0x590 net/ipv6/route.c:4467 >> > inet6_ioctl+0x265/0x2b0 net/ipv6/af_inet6.c:575 >> > sock_do_ioctl+0x113/0x270 net/socket.c:1220 >> > sock_ioctl+0x22e/0x6b0 net/socket.c:1339 >> > vfs_ioctl fs/ioctl.c:51 [inline] >> > __do_sys_ioctl fs/ioctl.c:871 [inline] >> > __se_sys_ioctl fs/ioctl.c:857 [inline] >> > __x64_sys_ioctl+0x18f/0x210 fs/ioctl.c:857 >> > do_syscall_x64 arch/x86/entry/common.c:51 [inline] >> > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 >> > entry_SYSCALL_64_after_hwframe+0x63/0x6b >> >> and warning messages you provided >> >> > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 >> > fib6_info_release include/net/ip6_fib.h:332 [inline] >> > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 >> > ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 >> >> It takes place in ip6_route_info_create() to do error handling. >> It can be fib6_has_expires() in fib6_info_release() in this case. > > Feel free to amend the patch, but the issue is that we insert a fib > gc_link to a list, > then free the fi6 object without removing it first from the external list. > > I added two different warnings, and removing one or both will still > keep the bug. The gc_link is not inserted here actually. (see my explanation in another message.) According to the messages in the thread head, it is an issue of dangling pointer, right? If I read it correctly, the original issue is gc_link pointing to a block of memory that is already free. Am I right? ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 18:46 ` Kui-Feng Lee @ 2023-12-07 18:55 ` Eric Dumazet 0 siblings, 0 replies; 22+ messages in thread From: Eric Dumazet @ 2023-12-07 18:55 UTC (permalink / raw) To: Kui-Feng Lee Cc: patchwork-bot+netdevbpf, Kui-Feng Lee, davem, kuba, pabeni, dsahern, netdev, eric.dumazet On Thu, Dec 7, 2023 at 7:46 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > > > > On 12/7/23 10:22, Eric Dumazet wrote: > > On Thu, Dec 7, 2023 at 7:19 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > >> > >> > >> > >> On 12/7/23 10:10, Eric Dumazet wrote: > >>> On Thu, Dec 7, 2023 at 7:06 PM Kui-Feng Lee <sinquersw@gmail.com> wrote: > >>> > >>>> Do you happen to have a test program that can reproduce it? > >>> > >>> syzbot has a repro, let me release the bug. > >>> > >>> Of course syzbot bisection points to my last patch. > >> > >> I just looked into the code. > >> The origin issue mentioned at the thread head should be something > >> related to a GC change I made. But, the warnings you added doesn't > >> catch the the error correctly. According to your stacktrace > >> > >> > >> > ip6_route_add+0x26/0x1f0 net/ipv6/route.c:3843 > >> > ipv6_route_ioctl+0x3ff/0x590 net/ipv6/route.c:4467 > >> > inet6_ioctl+0x265/0x2b0 net/ipv6/af_inet6.c:575 > >> > sock_do_ioctl+0x113/0x270 net/socket.c:1220 > >> > sock_ioctl+0x22e/0x6b0 net/socket.c:1339 > >> > vfs_ioctl fs/ioctl.c:51 [inline] > >> > __do_sys_ioctl fs/ioctl.c:871 [inline] > >> > __se_sys_ioctl fs/ioctl.c:857 [inline] > >> > __x64_sys_ioctl+0x18f/0x210 fs/ioctl.c:857 > >> > do_syscall_x64 arch/x86/entry/common.c:51 [inline] > >> > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 > >> > entry_SYSCALL_64_after_hwframe+0x63/0x6b > >> > >> and warning messages you provided > >> > >> > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > >> > fib6_info_release include/net/ip6_fib.h:332 [inline] > >> > WARNING: CPU: 0 PID: 5059 at include/net/ip6_fib.h:332 > >> > ip6_route_info_create+0x1a1a/0x1f10 net/ipv6/route.c:3829 > >> > >> It takes place in ip6_route_info_create() to do error handling. > >> It can be fib6_has_expires() in fib6_info_release() in this case. > > > > Feel free to amend the patch, but the issue is that we insert a fib > > gc_link to a list, > > then free the fi6 object without removing it first from the external list. > > > > I added two different warnings, and removing one or both will still > > keep the bug. > > The gc_link is not inserted here actually. (see my explanation in > another message.) > > According to the messages in the thread head, it is an issue of dangling > pointer, right? If I read it correctly, the original issue is gc_link > pointing to a block of memory that is already free. Am I right? Original issue is about gc_link corruption, or use-after-free Perhaps fib6_has_expires() should really be rewritten to use hlist_unhashed(&f6i->gc_link) Setting RTF_EXPIRES on f6i->fib6_flags seems redundant/risky in light of all the syzbot reports I had lately... ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-05 17:32 [PATCH net-next] ipv6: add debug checks in fib6_info_release() Eric Dumazet 2023-12-06 3:41 ` David Ahern 2023-12-07 3:10 ` patchwork-bot+netdevbpf @ 2023-12-07 23:02 ` Kui-Feng Lee 2023-12-08 9:18 ` Eric Dumazet 2 siblings, 1 reply; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-07 23:02 UTC (permalink / raw) To: Eric Dumazet, David S . Miller, Jakub Kicinski, Paolo Abeni Cc: David Ahern, netdev, eric.dumazet Hi Eric, could you also open a bug for this incident? On 12/5/23 09:32, Eric Dumazet wrote: > Some elusive syzbot reports are hinting to fib6_info_release(), > with a potential dangling f6i->gc_link anchor. > > Add debug checks so that syzbot can catch the issue earlier eventually. > > BUG: KASAN: slab-use-after-free in __hlist_del include/linux/list.h:990 [inline] > BUG: KASAN: slab-use-after-free in hlist_del_init include/linux/list.h:1016 [inline] > BUG: KASAN: slab-use-after-free in fib6_clean_expires_locked include/net/ip6_fib.h:533 [inline] > BUG: KASAN: slab-use-after-free in fib6_purge_rt+0x986/0x9c0 net/ipv6/ip6_fib.c:1064 > Write of size 8 at addr ffff88802805a840 by task syz-executor.1/10057 > > CPU: 1 PID: 10057 Comm: syz-executor.1 Not tainted 6.7.0-rc2-syzkaller-00029-g9b6de136b5f0 #0 > Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/10/2023 > Call Trace: > <TASK> > __dump_stack lib/dump_stack.c:88 [inline] > dump_stack_lvl+0xd9/0x1b0 lib/dump_stack.c:106 > print_address_description mm/kasan/report.c:364 [inline] > print_report+0xc4/0x620 mm/kasan/report.c:475 > kasan_report+0xda/0x110 mm/kasan/report.c:588 > __hlist_del include/linux/list.h:990 [inline] > hlist_del_init include/linux/list.h:1016 [inline] > fib6_clean_expires_locked include/net/ip6_fib.h:533 [inline] > fib6_purge_rt+0x986/0x9c0 net/ipv6/ip6_fib.c:1064 > fib6_del_route net/ipv6/ip6_fib.c:1993 [inline] > fib6_del+0xa7a/0x1750 net/ipv6/ip6_fib.c:2038 > __ip6_del_rt net/ipv6/route.c:3866 [inline] > ip6_del_rt+0xf7/0x200 net/ipv6/route.c:3881 > ndisc_router_discovery+0x295b/0x3560 net/ipv6/ndisc.c:1372 > ndisc_rcv+0x3de/0x5f0 net/ipv6/ndisc.c:1856 > icmpv6_rcv+0x1470/0x19c0 net/ipv6/icmp.c:979 > ip6_protocol_deliver_rcu+0x170/0x13e0 net/ipv6/ip6_input.c:438 > ip6_input_finish+0x14f/0x2f0 net/ipv6/ip6_input.c:483 > NF_HOOK include/linux/netfilter.h:314 [inline] > NF_HOOK include/linux/netfilter.h:308 [inline] > ip6_input+0xa1/0xc0 net/ipv6/ip6_input.c:492 > ip6_mc_input+0x48b/0xf40 net/ipv6/ip6_input.c:586 > dst_input include/net/dst.h:461 [inline] > ip6_rcv_finish net/ipv6/ip6_input.c:79 [inline] > NF_HOOK include/linux/netfilter.h:314 [inline] > NF_HOOK include/linux/netfilter.h:308 [inline] > ipv6_rcv+0x24e/0x380 net/ipv6/ip6_input.c:310 > __netif_receive_skb_one_core+0x115/0x180 net/core/dev.c:5529 > __netif_receive_skb+0x1f/0x1b0 net/core/dev.c:5643 > netif_receive_skb_internal net/core/dev.c:5729 [inline] > netif_receive_skb+0x133/0x700 net/core/dev.c:5788 > tun_rx_batched+0x429/0x780 drivers/net/tun.c:1579 > tun_get_user+0x29e3/0x3bc0 drivers/net/tun.c:2002 > tun_chr_write_iter+0xe8/0x210 drivers/net/tun.c:2048 > call_write_iter include/linux/fs.h:2020 [inline] > new_sync_write fs/read_write.c:491 [inline] > vfs_write+0x64f/0xdf0 fs/read_write.c:584 > ksys_write+0x12f/0x250 fs/read_write.c:637 > do_syscall_x64 arch/x86/entry/common.c:51 [inline] > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 > entry_SYSCALL_64_after_hwframe+0x63/0x6b > RIP: 0033:0x7f38e387b82f > Code: 89 54 24 18 48 89 74 24 10 89 7c 24 08 e8 b9 80 02 00 48 8b 54 24 18 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 31 44 89 c7 48 89 44 24 08 e8 0c 81 02 00 48 > RSP: 002b:00007f38e45c9090 EFLAGS: 00000293 ORIG_RAX: 0000000000000001 > RAX: ffffffffffffffda RBX: 00007f38e399bf80 RCX: 00007f38e387b82f > RDX: 00000000000003b6 RSI: 0000000020000680 RDI: 00000000000000c8 > RBP: 00007f38e38c847a R08: 0000000000000000 R09: 0000000000000000 > R10: 00000000000003b6 R11: 0000000000000293 R12: 0000000000000000 > R13: 000000000000000b R14: 00007f38e399bf80 R15: 00007f38e3abfa48 > </TASK> > > Allocated by task 10044: > kasan_save_stack+0x33/0x50 mm/kasan/common.c:45 > kasan_set_track+0x25/0x30 mm/kasan/common.c:52 > ____kasan_kmalloc mm/kasan/common.c:374 [inline] > __kasan_kmalloc+0xa2/0xb0 mm/kasan/common.c:383 > kasan_kmalloc include/linux/kasan.h:198 [inline] > __do_kmalloc_node mm/slab_common.c:1007 [inline] > __kmalloc+0x59/0x90 mm/slab_common.c:1020 > kmalloc include/linux/slab.h:604 [inline] > kzalloc include/linux/slab.h:721 [inline] > fib6_info_alloc+0x40/0x160 net/ipv6/ip6_fib.c:155 > ip6_route_info_create+0x337/0x1e70 net/ipv6/route.c:3749 > ip6_route_add+0x26/0x150 net/ipv6/route.c:3843 > rt6_add_route_info+0x2e7/0x4b0 net/ipv6/route.c:4316 > rt6_route_rcv+0x76c/0xbf0 net/ipv6/route.c:985 > ndisc_router_discovery+0x138b/0x3560 net/ipv6/ndisc.c:1529 > ndisc_rcv+0x3de/0x5f0 net/ipv6/ndisc.c:1856 > icmpv6_rcv+0x1470/0x19c0 net/ipv6/icmp.c:979 > ip6_protocol_deliver_rcu+0x170/0x13e0 net/ipv6/ip6_input.c:438 > ip6_input_finish+0x14f/0x2f0 net/ipv6/ip6_input.c:483 > NF_HOOK include/linux/netfilter.h:314 [inline] > NF_HOOK include/linux/netfilter.h:308 [inline] > ip6_input+0xa1/0xc0 net/ipv6/ip6_input.c:492 > ip6_mc_input+0x48b/0xf40 net/ipv6/ip6_input.c:586 > dst_input include/net/dst.h:461 [inline] > ip6_rcv_finish net/ipv6/ip6_input.c:79 [inline] > NF_HOOK include/linux/netfilter.h:314 [inline] > NF_HOOK include/linux/netfilter.h:308 [inline] > ipv6_rcv+0x24e/0x380 net/ipv6/ip6_input.c:310 > __netif_receive_skb_one_core+0x115/0x180 net/core/dev.c:5529 > __netif_receive_skb+0x1f/0x1b0 net/core/dev.c:5643 > netif_receive_skb_internal net/core/dev.c:5729 [inline] > netif_receive_skb+0x133/0x700 net/core/dev.c:5788 > tun_rx_batched+0x429/0x780 drivers/net/tun.c:1579 > tun_get_user+0x29e3/0x3bc0 drivers/net/tun.c:2002 > tun_chr_write_iter+0xe8/0x210 drivers/net/tun.c:2048 > call_write_iter include/linux/fs.h:2020 [inline] > new_sync_write fs/read_write.c:491 [inline] > vfs_write+0x64f/0xdf0 fs/read_write.c:584 > ksys_write+0x12f/0x250 fs/read_write.c:637 > do_syscall_x64 arch/x86/entry/common.c:51 [inline] > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 > entry_SYSCALL_64_after_hwframe+0x63/0x6b > > Freed by task 5123: > kasan_save_stack+0x33/0x50 mm/kasan/common.c:45 > kasan_set_track+0x25/0x30 mm/kasan/common.c:52 > kasan_save_free_info+0x2b/0x40 mm/kasan/generic.c:522 > ____kasan_slab_free mm/kasan/common.c:236 [inline] > ____kasan_slab_free+0x15b/0x1b0 mm/kasan/common.c:200 > kasan_slab_free include/linux/kasan.h:164 [inline] > slab_free_hook mm/slub.c:1800 [inline] > slab_free_freelist_hook+0x114/0x1e0 mm/slub.c:1826 > slab_free mm/slub.c:3809 [inline] > __kmem_cache_free+0xc0/0x180 mm/slub.c:3822 > rcu_do_batch kernel/rcu/tree.c:2158 [inline] > rcu_core+0x819/0x1680 kernel/rcu/tree.c:2431 > __do_softirq+0x21a/0x8de kernel/softirq.c:553 > > Last potentially related work creation: > kasan_save_stack+0x33/0x50 mm/kasan/common.c:45 > __kasan_record_aux_stack+0xbc/0xd0 mm/kasan/generic.c:492 > __call_rcu_common.constprop.0+0x9a/0x7a0 kernel/rcu/tree.c:2681 > fib6_info_release include/net/ip6_fib.h:332 [inline] > fib6_info_release include/net/ip6_fib.h:329 [inline] > rt6_route_rcv+0xa4e/0xbf0 net/ipv6/route.c:997 > ndisc_router_discovery+0x138b/0x3560 net/ipv6/ndisc.c:1529 > ndisc_rcv+0x3de/0x5f0 net/ipv6/ndisc.c:1856 > icmpv6_rcv+0x1470/0x19c0 net/ipv6/icmp.c:979 > ip6_protocol_deliver_rcu+0x170/0x13e0 net/ipv6/ip6_input.c:438 > ip6_input_finish+0x14f/0x2f0 net/ipv6/ip6_input.c:483 > NF_HOOK include/linux/netfilter.h:314 [inline] > NF_HOOK include/linux/netfilter.h:308 [inline] > ip6_input+0xa1/0xc0 net/ipv6/ip6_input.c:492 > ip6_mc_input+0x48b/0xf40 net/ipv6/ip6_input.c:586 > dst_input include/net/dst.h:461 [inline] > ip6_rcv_finish net/ipv6/ip6_input.c:79 [inline] > NF_HOOK include/linux/netfilter.h:314 [inline] > NF_HOOK include/linux/netfilter.h:308 [inline] > ipv6_rcv+0x24e/0x380 net/ipv6/ip6_input.c:310 > __netif_receive_skb_one_core+0x115/0x180 net/core/dev.c:5529 > __netif_receive_skb+0x1f/0x1b0 net/core/dev.c:5643 > netif_receive_skb_internal net/core/dev.c:5729 [inline] > netif_receive_skb+0x133/0x700 net/core/dev.c:5788 > tun_rx_batched+0x429/0x780 drivers/net/tun.c:1579 > tun_get_user+0x29e3/0x3bc0 drivers/net/tun.c:2002 > tun_chr_write_iter+0xe8/0x210 drivers/net/tun.c:2048 > call_write_iter include/linux/fs.h:2020 [inline] > new_sync_write fs/read_write.c:491 [inline] > vfs_write+0x64f/0xdf0 fs/read_write.c:584 > ksys_write+0x12f/0x250 fs/read_write.c:637 > do_syscall_x64 arch/x86/entry/common.c:51 [inline] > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 > entry_SYSCALL_64_after_hwframe+0x63/0x6b > > Second to last potentially related work creation: > kasan_save_stack+0x33/0x50 mm/kasan/common.c:45 > __kasan_record_aux_stack+0xbc/0xd0 mm/kasan/generic.c:492 > insert_work+0x38/0x230 kernel/workqueue.c:1647 > __queue_work+0xcdc/0x11f0 kernel/workqueue.c:1803 > call_timer_fn+0x193/0x590 kernel/time/timer.c:1700 > expire_timers kernel/time/timer.c:1746 [inline] > __run_timers+0x585/0xb20 kernel/time/timer.c:2022 > run_timer_softirq+0x58/0xd0 kernel/time/timer.c:2035 > __do_softirq+0x21a/0x8de kernel/softirq.c:553 > > The buggy address belongs to the object at ffff88802805a800 > which belongs to the cache kmalloc-512 of size 512 > The buggy address is located 64 bytes inside of > freed 512-byte region [ffff88802805a800, ffff88802805aa00) > > The buggy address belongs to the physical page: > page:ffffea0000a01600 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x28058 > head:ffffea0000a01600 order:2 entire_mapcount:0 nr_pages_mapped:0 pincount:0 > flags: 0xfff00000000840(slab|head|node=0|zone=1|lastcpupid=0x7ff) > page_type: 0xffffffff() > raw: 00fff00000000840 ffff888013041c80 ffffea0001e02600 dead000000000002 > raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000 > page dumped because: kasan: bad access detected > page_owner tracks the page as allocated > page last allocated via order 2, migratetype Unmovable, gfp_mask 0x1d20c0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__GFP_HARDWALL), pid 18706, tgid 18699 (syz-executor.2), ts 999991973280, free_ts 996884464281 > set_page_owner include/linux/page_owner.h:31 [inline] > post_alloc_hook+0x2d0/0x350 mm/page_alloc.c:1537 > prep_new_page mm/page_alloc.c:1544 [inline] > get_page_from_freelist+0xa25/0x36d0 mm/page_alloc.c:3312 > __alloc_pages+0x22e/0x2420 mm/page_alloc.c:4568 > alloc_pages_mpol+0x258/0x5f0 mm/mempolicy.c:2133 > alloc_slab_page mm/slub.c:1870 [inline] > allocate_slab mm/slub.c:2017 [inline] > new_slab+0x283/0x3c0 mm/slub.c:2070 > ___slab_alloc+0x979/0x1500 mm/slub.c:3223 > __slab_alloc.constprop.0+0x56/0xa0 mm/slub.c:3322 > __slab_alloc_node mm/slub.c:3375 [inline] > slab_alloc_node mm/slub.c:3468 [inline] > __kmem_cache_alloc_node+0x131/0x310 mm/slub.c:3517 > __do_kmalloc_node mm/slab_common.c:1006 [inline] > __kmalloc+0x49/0x90 mm/slab_common.c:1020 > kmalloc include/linux/slab.h:604 [inline] > kzalloc include/linux/slab.h:721 [inline] > copy_splice_read+0x1ac/0x8f0 fs/splice.c:338 > vfs_splice_read fs/splice.c:992 [inline] > vfs_splice_read+0x2ea/0x3b0 fs/splice.c:962 > splice_direct_to_actor+0x2a5/0xa30 fs/splice.c:1069 > do_splice_direct+0x1af/0x280 fs/splice.c:1194 > do_sendfile+0xb3e/0x1310 fs/read_write.c:1254 > __do_sys_sendfile64 fs/read_write.c:1322 [inline] > __se_sys_sendfile64 fs/read_write.c:1308 [inline] > __x64_sys_sendfile64+0x1d6/0x220 fs/read_write.c:1308 > do_syscall_x64 arch/x86/entry/common.c:51 [inline] > do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82 > page last free stack trace: > reset_page_owner include/linux/page_owner.h:24 [inline] > free_pages_prepare mm/page_alloc.c:1137 [inline] > free_unref_page_prepare+0x4fa/0xaa0 mm/page_alloc.c:2347 > free_unref_page_list+0xe6/0xb40 mm/page_alloc.c:2533 > release_pages+0x32a/0x14f0 mm/swap.c:1042 > tlb_batch_pages_flush+0x9a/0x190 mm/mmu_gather.c:98 > tlb_flush_mmu_free mm/mmu_gather.c:293 [inline] > tlb_flush_mmu mm/mmu_gather.c:300 [inline] > tlb_finish_mmu+0x14b/0x6f0 mm/mmu_gather.c:392 > exit_mmap+0x38b/0xa70 mm/mmap.c:3321 > __mmput+0x12a/0x4d0 kernel/fork.c:1349 > mmput+0x62/0x70 kernel/fork.c:1371 > exit_mm kernel/exit.c:567 [inline] > do_exit+0x9ad/0x2ae0 kernel/exit.c:858 > do_group_exit+0xd4/0x2a0 kernel/exit.c:1021 > get_signal+0x23be/0x2790 kernel/signal.c:2904 > arch_do_signal_or_restart+0x90/0x7f0 arch/x86/kernel/signal.c:309 > exit_to_user_mode_loop kernel/entry/common.c:168 [inline] > exit_to_user_mode_prepare+0x121/0x240 kernel/entry/common.c:204 > irqentry_exit_to_user_mode+0xa/0x40 kernel/entry/common.c:309 > asm_sysvec_apic_timer_interrupt+0x1a/0x20 arch/x86/include/asm/idtentry.h:645 > > Signed-off-by: Eric Dumazet <edumazet@google.com> > --- > include/net/ip6_fib.h | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h > index 1ba9f4ddf2f6db6c6ebf0a0675ca74fea2273fd9..e1e7a894863a7891610ce5afb2034473cc208d3e 100644 > --- a/include/net/ip6_fib.h > +++ b/include/net/ip6_fib.h > @@ -328,8 +328,11 @@ static inline bool fib6_info_hold_safe(struct fib6_info *f6i) > > static inline void fib6_info_release(struct fib6_info *f6i) > { > - if (f6i && refcount_dec_and_test(&f6i->fib6_ref)) > + if (f6i && refcount_dec_and_test(&f6i->fib6_ref)) { > + DEBUG_NET_WARN_ON_ONCE(fib6_has_expires(f6i)); > + DEBUG_NET_WARN_ON_ONCE(!hlist_unhashed(&f6i->gc_link)); > call_rcu(&f6i->rcu, fib6_info_destroy_rcu); > + } > } > > enum fib6_walk_state { ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-07 23:02 ` Kui-Feng Lee @ 2023-12-08 9:18 ` Eric Dumazet 2023-12-08 18:20 ` Kui-Feng Lee 0 siblings, 1 reply; 22+ messages in thread From: Eric Dumazet @ 2023-12-08 9:18 UTC (permalink / raw) To: Kui-Feng Lee Cc: David S . Miller, Jakub Kicinski, Paolo Abeni, David Ahern, netdev, eric.dumazet On Fri, Dec 8, 2023 at 12:02 AM Kui-Feng Lee <sinquersw@gmail.com> wrote: > > Hi Eric, could you also open a bug for this incident? What are you asking for exactly ? We have thousands of syzbot bugs, it is done by a bot, not a human. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH net-next] ipv6: add debug checks in fib6_info_release() 2023-12-08 9:18 ` Eric Dumazet @ 2023-12-08 18:20 ` Kui-Feng Lee 0 siblings, 0 replies; 22+ messages in thread From: Kui-Feng Lee @ 2023-12-08 18:20 UTC (permalink / raw) To: Eric Dumazet Cc: David S . Miller, Jakub Kicinski, Paolo Abeni, David Ahern, netdev, eric.dumazet On 12/8/23 01:18, Eric Dumazet wrote: > On Fri, Dec 8, 2023 at 12:02 AM Kui-Feng Lee <sinquersw@gmail.com> wrote: >> >> Hi Eric, could you also open a bug for this incident? > > What are you asking for exactly ? > > We have thousands of syzbot bugs, it is done by a bot, not a human. You mentioned "let me release the bug." [1] Then we have [2]. By the way, although I am not fixing the issue described by [2], I am using that email to talk with syzbot. [1] https://lore.kernel.org/all/CANn89iKpM33oQ+2dwoLHzZvECAjwiKJTR3cDM64nE6VvZA99Sg@mail.gmail.com/ [2] https://lore.kernel.org/all/000000000000cb5b07060bef7ac0@google.com/ ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2023-12-08 18:20 UTC | newest] Thread overview: 22+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-12-05 17:32 [PATCH net-next] ipv6: add debug checks in fib6_info_release() Eric Dumazet 2023-12-06 3:41 ` David Ahern 2023-12-07 3:10 ` patchwork-bot+netdevbpf 2023-12-07 13:29 ` Eric Dumazet 2023-12-07 16:43 ` Kui-Feng Lee 2023-12-07 18:06 ` Kui-Feng Lee 2023-12-07 18:10 ` Eric Dumazet 2023-12-07 18:19 ` Kui-Feng Lee 2023-12-07 18:22 ` Eric Dumazet 2023-12-07 18:25 ` David Ahern 2023-12-07 18:26 ` David Ahern 2023-12-07 18:36 ` Kui-Feng Lee 2023-12-07 18:40 ` Kui-Feng Lee 2023-12-07 19:00 ` Kui-Feng Lee 2023-12-07 19:05 ` Eric Dumazet 2023-12-07 19:08 ` Kui-Feng Lee 2023-12-07 19:14 ` Eric Dumazet 2023-12-07 18:46 ` Kui-Feng Lee 2023-12-07 18:55 ` Eric Dumazet 2023-12-07 23:02 ` Kui-Feng Lee 2023-12-08 9:18 ` Eric Dumazet 2023-12-08 18:20 ` Kui-Feng Lee
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.