Skip to content

Commit 50bf398

Browse files
committed
net: netdevsim: try to close UDP port harness races
syzbot discovered that we remove the debugfs files after we free the netdev. Try to clean up the relevant dir while the device is still around. Reported-by: [email protected] Fixes: 424be63 ("netdevsim: add UDP tunnel port offload support") Reviewed-by: Michal Swiatkowski <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 5de7665 commit 50bf398

File tree

3 files changed

+23
-17
lines changed

3 files changed

+23
-17
lines changed

drivers/net/netdevsim/netdevsim.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ struct netdevsim {
134134
u32 sleep;
135135
u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS];
136136
u32 (*ports)[NSIM_UDP_TUNNEL_N_PORTS];
137+
struct dentry *ddir;
137138
struct debugfs_u32_array dfs_ports[2];
138139
} udp_ports;
139140

drivers/net/netdevsim/udp_tunnels.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,11 @@ nsim_udp_tunnels_info_reset_write(struct file *file, const char __user *data,
112112
struct net_device *dev = file->private_data;
113113
struct netdevsim *ns = netdev_priv(dev);
114114

115-
memset(ns->udp_ports.ports, 0, sizeof(ns->udp_ports.__ports));
116115
rtnl_lock();
117-
udp_tunnel_nic_reset_ntf(dev);
116+
if (dev->reg_state == NETREG_REGISTERED) {
117+
memset(ns->udp_ports.ports, 0, sizeof(ns->udp_ports.__ports));
118+
udp_tunnel_nic_reset_ntf(dev);
119+
}
118120
rtnl_unlock();
119121

120122
return count;
@@ -144,23 +146,23 @@ int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev,
144146
else
145147
ns->udp_ports.ports = nsim_dev->udp_ports.__ports;
146148

147-
debugfs_create_u32("udp_ports_inject_error", 0600,
148-
ns->nsim_dev_port->ddir,
149+
ns->udp_ports.ddir = debugfs_create_dir("udp_ports",
150+
ns->nsim_dev_port->ddir);
151+
152+
debugfs_create_u32("inject_error", 0600, ns->udp_ports.ddir,
149153
&ns->udp_ports.inject_error);
150154

151155
ns->udp_ports.dfs_ports[0].array = ns->udp_ports.ports[0];
152156
ns->udp_ports.dfs_ports[0].n_elements = NSIM_UDP_TUNNEL_N_PORTS;
153-
debugfs_create_u32_array("udp_ports_table0", 0400,
154-
ns->nsim_dev_port->ddir,
157+
debugfs_create_u32_array("table0", 0400, ns->udp_ports.ddir,
155158
&ns->udp_ports.dfs_ports[0]);
156159

157160
ns->udp_ports.dfs_ports[1].array = ns->udp_ports.ports[1];
158161
ns->udp_ports.dfs_ports[1].n_elements = NSIM_UDP_TUNNEL_N_PORTS;
159-
debugfs_create_u32_array("udp_ports_table1", 0400,
160-
ns->nsim_dev_port->ddir,
162+
debugfs_create_u32_array("table1", 0400, ns->udp_ports.ddir,
161163
&ns->udp_ports.dfs_ports[1]);
162164

163-
debugfs_create_file("udp_ports_reset", 0200, ns->nsim_dev_port->ddir,
165+
debugfs_create_file("reset", 0200, ns->udp_ports.ddir,
164166
dev, &nsim_udp_tunnels_info_reset_fops);
165167

166168
/* Note: it's not normal to allocate the info struct like this!
@@ -196,6 +198,9 @@ int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev,
196198

197199
void nsim_udp_tunnels_info_destroy(struct net_device *dev)
198200
{
201+
struct netdevsim *ns = netdev_priv(dev);
202+
203+
debugfs_remove_recursive(ns->udp_ports.ddir);
199204
kfree(dev->udp_tunnel_nic_info);
200205
dev->udp_tunnel_nic_info = NULL;
201206
}

tools/testing/selftests/drivers/net/netdevsim/udp_tunnel_nic.sh

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ function pre_ethtool {
142142
}
143143

144144
function check_table {
145-
local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
145+
local path=$NSIM_DEV_DFS/ports/$port/udp_ports/table$1
146146
local -n expected=$2
147147
local last=$3
148148

@@ -212,7 +212,7 @@ function check_tables {
212212
}
213213

214214
function print_table {
215-
local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
215+
local path=$NSIM_DEV_DFS/ports/$port/udp_ports/table$1
216216
read -a have < $path
217217

218218
tree $NSIM_DEV_DFS/
@@ -641,7 +641,7 @@ for port in 0 1; do
641641
NSIM_NETDEV=`get_netdev_name old_netdevs`
642642
ip link set dev $NSIM_NETDEV up
643643

644-
echo 110 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
644+
echo 110 > $NSIM_DEV_DFS/ports/$port/udp_ports/inject_error
645645

646646
msg="1 - create VxLANs v6"
647647
exp0=( 0 0 0 0 )
@@ -663,7 +663,7 @@ for port in 0 1; do
663663
new_geneve gnv0 20000
664664

665665
msg="2 - destroy GENEVE"
666-
echo 2 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
666+
echo 2 > $NSIM_DEV_DFS/ports/$port/udp_ports/inject_error
667667
exp1=( `mke 20000 2` 0 0 0 )
668668
del_dev gnv0
669669

@@ -764,7 +764,7 @@ for port in 0 1; do
764764
msg="create VxLANs v4"
765765
new_vxlan vxlan0 10000 $NSIM_NETDEV
766766

767-
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
767+
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
768768
check_tables
769769

770770
msg="NIC device goes down"
@@ -775,7 +775,7 @@ for port in 0 1; do
775775
fi
776776
check_tables
777777

778-
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
778+
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
779779
check_tables
780780

781781
msg="NIC device goes up again"
@@ -789,7 +789,7 @@ for port in 0 1; do
789789
del_dev vxlan0
790790
check_tables
791791

792-
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
792+
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
793793
check_tables
794794

795795
msg="destroy NIC"
@@ -896,7 +896,7 @@ msg="vacate VxLAN in overflow table"
896896
exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
897897
del_dev vxlan2
898898

899-
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
899+
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
900900
check_tables
901901

902902
msg="tunnels destroyed 2"

0 commit comments

Comments
 (0)