Skip to content

Commit c5da4b6

Browse files
committed
Merge branch 'bonding-fix-null-deref-in-bond_rr_gen_slave_id'
Jonathan Toppins says: ==================== bonding: fix NULL deref in bond_rr_gen_slave_id Fix a NULL dereference of the struct bonding.rr_tx_counter member because if a bond is initially created with an initial mode != zero (Round Robin) the memory required for the counter is never created and when the mode is changed there is never any attempt to verify the memory is allocated upon switching modes. ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 2002fba + 2ffd573 commit c5da4b6

File tree

3 files changed

+57
-10
lines changed

3 files changed

+57
-10
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4182,6 +4182,12 @@ static int bond_open(struct net_device *bond_dev)
41824182
struct list_head *iter;
41834183
struct slave *slave;
41844184

4185+
if (BOND_MODE(bond) == BOND_MODE_ROUNDROBIN && !bond->rr_tx_counter) {
4186+
bond->rr_tx_counter = alloc_percpu(u32);
4187+
if (!bond->rr_tx_counter)
4188+
return -ENOMEM;
4189+
}
4190+
41854191
/* reset slave->backup and slave->inactive */
41864192
if (bond_has_slaves(bond)) {
41874193
bond_for_each_slave(bond, slave, iter) {
@@ -6243,15 +6249,6 @@ static int bond_init(struct net_device *bond_dev)
62436249
if (!bond->wq)
62446250
return -ENOMEM;
62456251

6246-
if (BOND_MODE(bond) == BOND_MODE_ROUNDROBIN) {
6247-
bond->rr_tx_counter = alloc_percpu(u32);
6248-
if (!bond->rr_tx_counter) {
6249-
destroy_workqueue(bond->wq);
6250-
bond->wq = NULL;
6251-
return -ENOMEM;
6252-
}
6253-
}
6254-
62556252
spin_lock_init(&bond->stats_lock);
62566253
netdev_lockdep_set_classes(bond_dev);
62576254

tools/testing/selftests/drivers/net/bonding/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
# Makefile for net selftests
33

44
TEST_PROGS := bond-break-lacpdu-tx.sh \
5-
dev_addr_lists.sh
5+
dev_addr_lists.sh \
6+
bond-arp-interval-causes-panic.sh
67

78
TEST_FILES := lag_lib.sh
89

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#!/bin/sh
2+
# SPDX-License-Identifier: GPL-2.0
3+
#
4+
# cause kernel oops in bond_rr_gen_slave_id
5+
DEBUG=${DEBUG:-0}
6+
7+
set -e
8+
test ${DEBUG} -ne 0 && set -x
9+
10+
finish()
11+
{
12+
ip netns delete server || true
13+
ip netns delete client || true
14+
ip link del link1_1 || true
15+
}
16+
17+
trap finish EXIT
18+
19+
client_ip4=192.168.1.198
20+
server_ip4=192.168.1.254
21+
22+
# setup kernel so it reboots after causing the panic
23+
echo 180 >/proc/sys/kernel/panic
24+
25+
# build namespaces
26+
ip link add dev link1_1 type veth peer name link1_2
27+
28+
ip netns add "server"
29+
ip link set dev link1_2 netns server up name eth0
30+
ip netns exec server ip addr add ${server_ip4}/24 dev eth0
31+
32+
ip netns add "client"
33+
ip link set dev link1_1 netns client down name eth0
34+
ip netns exec client ip link add dev bond0 down type bond mode 1 \
35+
miimon 100 all_slaves_active 1
36+
ip netns exec client ip link set dev eth0 down master bond0
37+
ip netns exec client ip link set dev bond0 up
38+
ip netns exec client ip addr add ${client_ip4}/24 dev bond0
39+
ip netns exec client ping -c 5 $server_ip4 >/dev/null
40+
41+
ip netns exec client ip link set dev eth0 down nomaster
42+
ip netns exec client ip link set dev bond0 down
43+
ip netns exec client ip link set dev bond0 type bond mode 0 \
44+
arp_interval 1000 arp_ip_target "+${server_ip4}"
45+
ip netns exec client ip link set dev eth0 down master bond0
46+
ip netns exec client ip link set dev bond0 up
47+
ip netns exec client ping -c 5 $server_ip4 >/dev/null
48+
49+
exit 0

0 commit comments

Comments
 (0)