FAILED: patch "[PATCH] batman-adv: Request iflink once in batadv-on-batadv check" failed to apply to 4.9-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 690bb6fb64f5dc7437317153902573ecad67593d Mon Sep 17 00:00:00 2001
From: Sven Eckelmann <[email protected]>
Date: Mon, 28 Feb 2022 00:01:24 +0100
Subject: [PATCH] batman-adv: Request iflink once in batadv-on-batadv check
There is no need to call dev_get_iflink multiple times for the same net_device in batadv_is_on_batman_iface. And since some of the .ndo_get_iflink callbacks are dynamic (for example via RCUs like in vxcan_get_iflink), it could easily happen that the returned values are not stable. The pre-checks before __dev_get_by_index are then of course bogus.
net/batman-adv/hard-interface.c +5 -4
@@ -149,22 +149,23 @@ static bool batadv_is_on_batman_iface(const struct net_device *net_dev)struct net *net =dev_net (net_dev);struct net_device *parent_dev;struct net *parent_net; +int iflink;bool ret;/* check if this is a batman-adv mesh interface */ if (batadv_softif_is_valid (net_dev))return true; + iflink =dev_get_iflink (net_dev); +/* no more parents..stop recursion */ -if (dev_get_iflink (net_dev) ==0 || -dev_get_iflink (net_dev) == net_dev->ifindex) +if (iflink ==0 || iflink == net_dev->ifindex)return false; parent_net =batadv_getlink_net (net_dev, net);/* recurse over the parent device */ - parent_dev =__dev_get_by_index ((struct net *)parent_net, -dev_get_iflink (net_dev)); + parent_dev =__dev_get_by_index ((struct net *)parent_net, iflink);/* if we got a NULL parent_dev there is something broken.. */ if (!parent_dev) {pr_err ("Cannot find parent device\n" );