lkml.org 
[lkml]   [2018]   [Mar]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 24/36] netlink: ensure to loop over all netns in genlmsg_multicast_allns()
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Nicolas Dichtel <nicolas.dichtel@6wind.com>


    [ Upstream commit cb9f7a9a5c96a773bbc9c70660dc600cfff82f82 ]

    Nowadays, nlmsg_multicast() returns only 0 or -ESRCH but this was not the
    case when commit 134e63756d5f was pushed.
    However, there was no reason to stop the loop if a netns does not have
    listeners.
    Returns -ESRCH only if there was no listeners in all netns.

    To avoid having the same problem in the future, I didn't take the
    assumption that nlmsg_multicast() returns only 0 or -ESRCH.

    Fixes: 134e63756d5f ("genetlink: make netns aware")
    CC: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/netlink/genetlink.c | 12 ++++++++++--
    1 file changed, 10 insertions(+), 2 deletions(-)

    --- a/net/netlink/genetlink.c
    +++ b/net/netlink/genetlink.c
    @@ -1118,6 +1118,7 @@ static int genlmsg_mcast(struct sk_buff
    {
    struct sk_buff *tmp;
    struct net *net, *prev = NULL;
    + bool delivered = false;
    int err;

    for_each_net_rcu(net) {
    @@ -1129,14 +1130,21 @@ static int genlmsg_mcast(struct sk_buff
    }
    err = nlmsg_multicast(prev->genl_sock, tmp,
    portid, group, flags);
    - if (err)
    + if (!err)
    + delivered = true;
    + else if (err != -ESRCH)
    goto error;
    }

    prev = net;
    }

    - return nlmsg_multicast(prev->genl_sock, skb, portid, group, flags);
    + err = nlmsg_multicast(prev->genl_sock, skb, portid, group, flags);
    + if (!err)
    + delivered = true;
    + else if (err != -ESRCH)
    + goto error;
    + return delivered ? 0 : -ESRCH;
    error:
    kfree_skb(skb);
    return err;

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