Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'vrf-fix-address-binding-with-icmp-socket'

Nicolas Dichtel says:

====================
vrf: fix address binding with icmp socket

The first patch fixes the issue.
The second patch adds related tests in selftests.
====================

Link: https://lore.kernel.org/r/20220504090739.21821-1-nicolas.dichtel@6wind.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+23 -1
+11 -1
net/ipv4/ping.c
··· 305 305 struct net *net = sock_net(sk); 306 306 if (sk->sk_family == AF_INET) { 307 307 struct sockaddr_in *addr = (struct sockaddr_in *) uaddr; 308 + u32 tb_id = RT_TABLE_LOCAL; 308 309 int chk_addr_ret; 309 310 310 311 if (addr_len < sizeof(*addr)) ··· 319 318 pr_debug("ping_check_bind_addr(sk=%p,addr=%pI4,port=%d)\n", 320 319 sk, &addr->sin_addr.s_addr, ntohs(addr->sin_port)); 321 320 322 - chk_addr_ret = inet_addr_type(net, addr->sin_addr.s_addr); 321 + tb_id = l3mdev_fib_table_by_index(net, sk->sk_bound_dev_if) ? : tb_id; 322 + chk_addr_ret = inet_addr_type_table(net, addr->sin_addr.s_addr, tb_id); 323 323 324 324 if (!inet_addr_valid_or_nonlocal(net, inet_sk(sk), 325 325 addr->sin_addr.s_addr, ··· 352 350 rcu_read_lock(); 353 351 if (addr->sin6_scope_id) { 354 352 dev = dev_get_by_index_rcu(net, addr->sin6_scope_id); 353 + if (!dev) { 354 + rcu_read_unlock(); 355 + return -ENODEV; 356 + } 357 + } 358 + 359 + if (!dev && sk->sk_bound_dev_if) { 360 + dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if); 355 361 if (!dev) { 356 362 rcu_read_unlock(); 357 363 return -ENODEV;
+12
tools/testing/selftests/net/fcnal-test.sh
··· 810 810 setup 811 811 set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null 812 812 ipv4_ping_novrf 813 + setup 814 + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null 815 + ipv4_ping_novrf 813 816 814 817 log_subsection "With VRF" 815 818 setup "yes" 819 + ipv4_ping_vrf 820 + setup "yes" 821 + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null 816 822 ipv4_ping_vrf 817 823 } 818 824 ··· 2354 2348 log_subsection "No VRF" 2355 2349 setup 2356 2350 ipv6_ping_novrf 2351 + setup 2352 + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null 2353 + ipv6_ping_novrf 2357 2354 2358 2355 log_subsection "With VRF" 2359 2356 setup "yes" 2357 + ipv6_ping_vrf 2358 + setup "yes" 2359 + set_sysctl net.ipv4.ping_group_range='0 2147483647' 2>/dev/null 2360 2360 ipv6_ping_vrf 2361 2361 } 2362 2362