batman-adv: Hold rtnl lock during MTU update via netlink
authorSven Eckelmann <sven@narfation.org>
Mon, 21 Aug 2023 19:48:48 +0000 (21:48 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 Aug 2023 14:11:08 +0000 (16:11 +0200)
commit 987aae75fc1041072941ffb622b45ce2359a99b9 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/batman-adv/netlink.c

index a5e4a4e..86e0664 100644 (file)
@@ -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]) {