Skip to content

Commit 0f57a1e

Browse files
committed
Merge branch 'net-rmnet-fix-interface-leak-for-rmnet-module'
Taehee Yoo says: ==================== net: rmnet: fix interface leak for rmnet module There are two problems in rmnet module that they occur the leak of a lower interface. The symptom is the same, which is the leak of a lower interface. But there are two different real problems. This patchset is to fix these real problems. 1. Do not allow to have different two modes. As a lower interface of rmnet, there are two modes that they are VND and BRIDGE. One interface can have only one mode. But in the current rmnet, there is no code to prevent to have two modes in one lower interface. So, interface leak occurs. 2. Do not allow to add multiple bridge interfaces. rmnet can have only two bridge interface. If an additional bridge interface is tried to be attached, rmnet should deny it. But there is no code to do that. So, interface leak occurs. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents ccfc9df + 2fb2799 commit 0f57a1e

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,23 @@ static int rmnet_unregister_real_device(struct net_device *real_dev)
4747
return 0;
4848
}
4949

50-
static int rmnet_register_real_device(struct net_device *real_dev)
50+
static int rmnet_register_real_device(struct net_device *real_dev,
51+
struct netlink_ext_ack *extack)
5152
{
5253
struct rmnet_port *port;
5354
int rc, entry;
5455

5556
ASSERT_RTNL();
5657

57-
if (rmnet_is_real_dev_registered(real_dev))
58+
if (rmnet_is_real_dev_registered(real_dev)) {
59+
port = rmnet_get_port_rtnl(real_dev);
60+
if (port->rmnet_mode != RMNET_EPMODE_VND) {
61+
NL_SET_ERR_MSG_MOD(extack, "bridge device already exists");
62+
return -EINVAL;
63+
}
64+
5865
return 0;
66+
}
5967

6068
port = kzalloc(sizeof(*port), GFP_KERNEL);
6169
if (!port)
@@ -133,7 +141,7 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
133141

134142
mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]);
135143

136-
err = rmnet_register_real_device(real_dev);
144+
err = rmnet_register_real_device(real_dev, extack);
137145
if (err)
138146
goto err0;
139147

@@ -422,7 +430,7 @@ int rmnet_add_bridge(struct net_device *rmnet_dev,
422430
}
423431

424432
if (port->rmnet_mode != RMNET_EPMODE_VND) {
425-
NL_SET_ERR_MSG_MOD(extack, "bridge device already exists");
433+
NL_SET_ERR_MSG_MOD(extack, "more than one bridge dev attached");
426434
return -EINVAL;
427435
}
428436

@@ -433,7 +441,7 @@ int rmnet_add_bridge(struct net_device *rmnet_dev,
433441
return -EBUSY;
434442
}
435443

436-
err = rmnet_register_real_device(slave_dev);
444+
err = rmnet_register_real_device(slave_dev, extack);
437445
if (err)
438446
return -EBUSY;
439447

0 commit comments

Comments
 (0)