lkml.org 
[lkml]   [2022]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 23/51] batman-adv: Request iflink once in batadv-on-batadv check
    Date
    From: Sven Eckelmann <sven@narfation.org>

    commit 690bb6fb64f5dc7437317153902573ecad67593d upstream.

    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.

    Fixes: b7eddd0b3950 ("batman-adv: prevent using any virtual device created on batman-adv as hard-interface")
    Signed-off-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/batman-adv/hard-interface.c | 9 +++++----
    1 file changed, 5 insertions(+), 4 deletions(-)

    --- a/net/batman-adv/hard-interface.c
    +++ b/net/batman-adv/hard-interface.c
    @@ -162,22 +162,23 @@ static bool batadv_is_on_batman_iface(co
    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");

    \
     
     \ /
      Last update: 2022-03-07 10:29    [W:17.651 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site