Skip to content

Commit fef30d6

Browse files
committed
Merge branch 'net-smc-fixes-2021-11-24'
Karsten Graul says: ==================== net/smc: fixes 2021-11-24 Patch 1 from DaXing fixes a possible loop in smc_listen(). Patch 2 prevents a NULL pointer dereferencing while iterating over the lower network devices. ==================== Link: https://lore.kernel.org/r/20211124123238.471429-1-kgraul@linux.ibm.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 06e5ba7 + 9ebb0c4 commit fef30d6

File tree

2 files changed

+21
-18
lines changed

2 files changed

+21
-18
lines changed

net/smc/af_smc.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2134,8 +2134,10 @@ static int smc_listen(struct socket *sock, int backlog)
21342134
smc->clcsock->sk->sk_user_data =
21352135
(void *)((uintptr_t)smc | SK_USER_DATA_NOCOPY);
21362136
rc = kernel_listen(smc->clcsock, backlog);
2137-
if (rc)
2137+
if (rc) {
2138+
smc->clcsock->sk->sk_data_ready = smc->clcsk_data_ready;
21382139
goto out;
2140+
}
21392141
sk->sk_max_ack_backlog = backlog;
21402142
sk->sk_ack_backlog = 0;
21412143
sk->sk_state = SMC_LISTEN;

net/smc/smc_core.c

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1672,14 +1672,26 @@ static void smc_link_down_work(struct work_struct *work)
16721672
mutex_unlock(&lgr->llc_conf_mutex);
16731673
}
16741674

1675-
/* Determine vlan of internal TCP socket.
1676-
* @vlan_id: address to store the determined vlan id into
1677-
*/
1675+
static int smc_vlan_by_tcpsk_walk(struct net_device *lower_dev,
1676+
struct netdev_nested_priv *priv)
1677+
{
1678+
unsigned short *vlan_id = (unsigned short *)priv->data;
1679+
1680+
if (is_vlan_dev(lower_dev)) {
1681+
*vlan_id = vlan_dev_vlan_id(lower_dev);
1682+
return 1;
1683+
}
1684+
1685+
return 0;
1686+
}
1687+
1688+
/* Determine vlan of internal TCP socket. */
16781689
int smc_vlan_by_tcpsk(struct socket *clcsock, struct smc_init_info *ini)
16791690
{
16801691
struct dst_entry *dst = sk_dst_get(clcsock->sk);
1692+
struct netdev_nested_priv priv;
16811693
struct net_device *ndev;
1682-
int i, nest_lvl, rc = 0;
1694+
int rc = 0;
16831695

16841696
ini->vlan_id = 0;
16851697
if (!dst) {
@@ -1697,20 +1709,9 @@ int smc_vlan_by_tcpsk(struct socket *clcsock, struct smc_init_info *ini)
16971709
goto out_rel;
16981710
}
16991711

1712+
priv.data = (void *)&ini->vlan_id;
17001713
rtnl_lock();
1701-
nest_lvl = ndev->lower_level;
1702-
for (i = 0; i < nest_lvl; i++) {
1703-
struct list_head *lower = &ndev->adj_list.lower;
1704-
1705-
if (list_empty(lower))
1706-
break;
1707-
lower = lower->next;
1708-
ndev = (struct net_device *)netdev_lower_get_next(ndev, &lower);
1709-
if (is_vlan_dev(ndev)) {
1710-
ini->vlan_id = vlan_dev_vlan_id(ndev);
1711-
break;
1712-
}
1713-
}
1714+
netdev_walk_all_lower_dev(ndev, smc_vlan_by_tcpsk_walk, &priv);
17141715
rtnl_unlock();
17151716

17161717
out_rel:

0 commit comments

Comments
 (0)