• Eric Dumazet's avatar
    ipv6: fix data-race in fib6_info_hw_flags_set / fib6_purge_rt · d95d6320
    Eric Dumazet authored
    Because fib6_info_hw_flags_set() is called without any synchronization,
    all accesses to gi6->offload, fi->trap and fi->offload_failed
    need some basic protection like READ_ONCE()/WRITE_ONCE().
    
    BUG: KCSAN: data-race in fib6_info_hw_flags_set / fib6_purge_rt
    
    read to 0xffff8881087d5886 of 1 bytes by task 13953 on cpu 0:
     fib6_drop_pcpu_from net/ipv6/ip6_fib.c:1007 [inline]
     fib6_purge_rt+0x4f/0x580 net/ipv6/ip6_fib.c:1033
     fib6_del_route net/ipv6/ip6_fib.c:1983 [inline]
     fib6_del+0x696/0x890 net/ipv6/ip6_fib.c:2028
     __ip6_del_rt net/ipv6/route.c:3876 [inline]
     ip6_del_rt+0x83/0x140 net/ipv6/route.c:3891
     __ipv6_dev_ac_dec+0x2b5/0x370 net/ipv6/anycast.c:374
     ipv6_dev_ac_dec net/ipv6/anycast.c:387 [inline]
     __ipv6_sock_ac_close+0x141/0x200 net/ipv6/anycast.c:207
     ipv6_sock_ac_close+0x79/0x90 net/ipv6/anycast.c:220
     inet6_release+0x32/0x50 net/ipv6/af_inet6.c:476
     __sock_release net/socket.c:650 [inline]
     sock_close+0x6c/0x150 net/socket.c:1318
     __fput+0x295/0x520 fs/file_table.c:280
     ____fput+0x11/0x20 fs/file_table.c:313
     task_work_run+0x8e/0x110 kernel/task_work.c:164
     tracehook_notify_resume include/linux/tracehook.h:189 [inline]
     exit_to_user_mode_loop kernel/entry/common.c:175 [inline]
     exit_to_user_mode_prepare+0x160/0x190 kernel/entry/common.c:207
     __syscall_exit_to_user_mode_work kernel/entry/common.c:289 [inline]
     syscall_exit_to_user_mode+0x20/0x40 kernel/entry/common.c:300
     do_syscall_64+0x50/0xd0 arch/x86/entry/common.c:86
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    write to 0xffff8881087d5886 of 1 bytes by task 1912 on cpu 1:
     fib6_info_hw_flags_set+0x155/0x3b0 net/ipv6/route.c:6230
     nsim_fib6_rt_hw_flags_set drivers/net/netdevsim/fib.c:668 [inline]
     nsim_fib6_rt_add drivers/net/netdevsim/fib.c:691 [inline]
     nsim_fib6_rt_insert drivers/net/netdevsim/fib.c:756 [inline]
     nsim_fib6_event drivers/net/netdevsim/fib.c:853 [inline]
     nsim_fib_event drivers/net/netdevsim/fib.c:886 [inline]
     nsim_fib_event_work+0x284f/0x2cf0 drivers/net/netdevsim/fib.c:1477
     process_one_work+0x3f6/0x960 kernel/workqueue.c:2307
     worker_thread+0x616/0xa70 kernel/workqueue.c:2454
     kthread+0x2c7/0x2e0 kernel/kthread.c:327
     ret_from_fork+0x1f/0x30
    
    value changed: 0x22 -> 0x2a
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 1 PID: 1912 Comm: kworker/1:3 Not tainted 5.16.0-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Workqueue: events nsim_fib_event_work
    
    Fixes: 0c5fcf9e ("IPv6: Add "offload failed" indication to routes")
    Fixes: bb3c4ab9 ("ipv6: Add "offload" and "trap" indications to routes")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Amit Cohen <amcohen@nvidia.com>
    Cc: Ido Schimmel <idosch@nvidia.com>
    Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
    Link: https://lore.kernel.org/r/20220216173217.3792411-2-eric.dumazet@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d95d6320
ip6_fib.h 15.8 KB