mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 01:04:41 +01:00
Merge branch 'net-ipv6-fix-panic-when-ipv4-route-references-loopback-ipv6-nexthop-and-add-selftest'
Jiayuan Chen says: ==================== net: ipv6: fix panic when IPv4 route references loopback IPv6 nexthop and add selftest syzbot reported a kernel panic [1] when an IPv4 route references a loopback IPv6 nexthop object: BUG: unable to handle page fault for address: ffff8d069e7aa000 PF: supervisor read access in kernel mode PF: error_code(0x0000) - not-present page PGD 6aa01067 P4D 6aa01067 PUD 0 Oops: Oops: 0000 [#1] SMP PTI CPU: 2 UID: 0 PID: 530 Comm: ping Not tainted 6.19.0+ #193 PREEMPT RIP: 0010:ip_route_output_key_hash_rcu+0x578/0x9e0 RSP: 0018:ffffd2ffc1573918 EFLAGS: 00010286 RAX: ffff8d069e7aa000 RBX: ffffd2ffc1573988 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 RBP: ffffd2ffc1573978 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: ffff8d060d496000 R13: 0000000000000000 R14: ffff8d060399a600 R15: ffff8d06019a6ab8 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffff8d069e7aa000 CR3: 0000000106eb0001 CR4: 0000000000770ef0 PKRU: 55555554 Call Trace: <TASK> ip_route_output_key_hash+0x86/0x1a0 __ip4_datagram_connect+0x2b5/0x4e0 udp_connect+0x2c/0x60 inet_dgram_connect+0x88/0xd0 __sys_connect_file+0x56/0x90 __sys_connect+0xa8/0xe0 __x64_sys_connect+0x18/0x30 x64_sys_call+0xfb9/0x26e0 do_syscall_64+0xd3/0x1510 entry_SYSCALL_64_after_hwframe+0x76/0x7e Reproduction: ip -6 nexthop add id 100 dev lo ip route add 172.20.20.0/24 nhid 100 ping -c1 172.20.20.1 # kernel crash Problem Description When a standalone IPv6 nexthop object is created with a loopback device, fib6_nh_init() misclassifies it as a reject route. Nexthop objects have no destination prefix (fc_dst=::), so fib6_is_reject() always matches any loopback nexthop. The reject path skips fib_nh_common_init(), leaving nhc_pcpu_rth_output unallocated. When an IPv4 route later references this nexthop and triggers a route lookup, __mkroute_output() calls raw_cpu_ptr(nhc->nhc_pcpu_rth_output) on a NULL pointer, causing a page fault. The reject classification was designed for regular IPv6 routes to prevent kernel routing loops, but nexthop objects should not be subject to this check since they carry no destination information. Loop prevention is handled separately when the route itself is created. [1] https://syzkaller.appspot.com/bug?extid=334190e097a98a1b81bb ==================== Link: https://patch.msgid.link/20260304113817.294966-1-jiayuan.chen@linux.dev Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
4517b74cc0
2 changed files with 14 additions and 5 deletions
|
|
@ -3583,7 +3583,6 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
|
|||
netdevice_tracker *dev_tracker = &fib6_nh->fib_nh_dev_tracker;
|
||||
struct net_device *dev = NULL;
|
||||
struct inet6_dev *idev = NULL;
|
||||
int addr_type;
|
||||
int err;
|
||||
|
||||
fib6_nh->fib_nh_family = AF_INET6;
|
||||
|
|
@ -3625,11 +3624,10 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
|
|||
|
||||
fib6_nh->fib_nh_weight = 1;
|
||||
|
||||
/* We cannot add true routes via loopback here,
|
||||
* they would result in kernel looping; promote them to reject routes
|
||||
/* Reset the nexthop device to the loopback device in case of reject
|
||||
* routes.
|
||||
*/
|
||||
addr_type = ipv6_addr_type(&cfg->fc_dst);
|
||||
if (fib6_is_reject(cfg->fc_flags, dev, addr_type)) {
|
||||
if (cfg->fc_flags & RTF_REJECT) {
|
||||
/* hold loopback dev/idev if we haven't done so. */
|
||||
if (dev != net->loopback_dev) {
|
||||
if (dev) {
|
||||
|
|
|
|||
|
|
@ -1672,6 +1672,17 @@ ipv4_withv6_fcnal()
|
|||
|
||||
run_cmd "$IP ro replace 172.16.101.1/32 via inet6 2001:db8:50::1 dev veth1"
|
||||
log_test $? 2 "IPv4 route with invalid IPv6 gateway"
|
||||
|
||||
# Test IPv4 route with loopback IPv6 nexthop
|
||||
# Regression test: loopback IPv6 nexthop was misclassified as reject
|
||||
# route, skipping nhc_pcpu_rth_output allocation, causing panic when
|
||||
# an IPv4 route references it and triggers __mkroute_output().
|
||||
run_cmd "$IP -6 nexthop add id 20 dev lo"
|
||||
run_cmd "$IP ro add 172.20.20.0/24 nhid 20"
|
||||
run_cmd "ip netns exec $me ping -c1 -W1 172.20.20.1"
|
||||
log_test $? 1 "IPv4 route with loopback IPv6 nexthop (no crash)"
|
||||
run_cmd "$IP ro del 172.20.20.0/24"
|
||||
run_cmd "$IP nexthop del id 20"
|
||||
}
|
||||
|
||||
ipv4_fcnal_runtime()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue