diff options
author | Sven Eckelmann <sven@narfation.org> | 2023-08-21 21:48:48 +0200 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2023-08-22 17:25:10 -0700 |
commit | 987aae75fc1041072941ffb622b45ce2359a99b9 (patch) | |
tree | d6e3727e56c67b83ded6d42f358be5e61db89d1b /net | |
parent | b888c510f7b3d64ca75fc0f43b4a4bd1a611312f (diff) | |
download | linux-987aae75fc1041072941ffb622b45ce2359a99b9.tar.gz linux-987aae75fc1041072941ffb622b45ce2359a99b9.tar.bz2 linux-987aae75fc1041072941ffb622b45ce2359a99b9.zip |
batman-adv: Hold rtnl lock during MTU update via netlink
The automatic recalculation of the maximum allowed MTU is usually triggered
by code sections which are already rtnl lock protected by callers outside
of batman-adv. But when the fragmentation setting is changed via
batman-adv's own batadv genl family, then the rtnl lock is not yet taken.
But dev_set_mtu requires that the caller holds the rtnl lock because it
uses netdevice notifiers. And this code will then fail the check for this
lock:
RTNL: assertion failed at net/core/dev.c (1953)
Cc: stable@vger.kernel.org
Reported-by: syzbot+f8812454d9b3ac00d282@syzkaller.appspotmail.com
Fixes: c6a953cce8d0 ("batman-adv: Trigger events for auto adjusted MTU")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20230821-batadv-missing-mtu-rtnl-lock-v1-1-1c5a7bfe861e@narfation.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/batman-adv/netlink.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c index ad5714f737be..6efbc9275aec 100644 --- a/net/batman-adv/netlink.c +++ b/net/batman-adv/netlink.c @@ -495,7 +495,10 @@ static int batadv_netlink_set_mesh(struct sk_buff *skb, struct genl_info *info) attr = info->attrs[BATADV_ATTR_FRAGMENTATION_ENABLED]; atomic_set(&bat_priv->fragmentation, !!nla_get_u8(attr)); + + rtnl_lock(); batadv_update_min_mtu(bat_priv->soft_iface); + rtnl_unlock(); } if (info->attrs[BATADV_ATTR_GW_BANDWIDTH_DOWN]) { |