lkml.org 
[lkml]   [2014]   [Feb]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.11 215/233] net: avoid reference counter overflows on fib_rules in multicast forwarding
    Date
    3.11.10.4 -stable review patch.  If anyone has any objections, please let me know.

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

    From: Hannes Frederic Sowa <hannes@stressinduktion.org>

    commit 95f4a45de1a0f172b35451fc52283290adb21f6e upstream.

    Bob Falken reported that after 4G packets, multicast forwarding stopped
    working. This was because of a rule reference counter overflow which
    freed the rule as soon as the overflow happend.

    This patch solves this by adding the FIB_LOOKUP_NOREF flag to
    fib_rules_lookup calls. This is safe even from non-rcu locked sections
    as in this case the flag only implies not taking a reference to the rule,
    which we don't need at all.

    Rules only hold references to the namespace, which are guaranteed to be
    available during the call of the non-rcu protected function reg_vif_xmit
    because of the interface reference which itself holds a reference to
    the net namespace.

    Fixes: f0ad0860d01e47 ("ipv4: ipmr: support multiple tables")
    Fixes: d1db275dd3f6e4 ("ipv6: ip6mr: support multiple tables")
    Reported-by: Bob Falken <NetFestivalHaveFun@gmx.com>
    Cc: Patrick McHardy <kaber@trash.net>
    Cc: Thomas Graf <tgraf@suug.ch>
    Cc: Julian Anastasov <ja@ssi.bg>
    Cc: Eric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
    Acked-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    net/ipv4/ipmr.c | 7 +++++--
    net/ipv6/ip6mr.c | 7 +++++--
    2 files changed, 10 insertions(+), 4 deletions(-)

    diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
    index 20cb33a..6fabc8d 100644
    --- a/net/ipv4/ipmr.c
    +++ b/net/ipv4/ipmr.c
    @@ -157,9 +157,12 @@ static struct mr_table *ipmr_get_table(struct net *net, u32 id)
    static int ipmr_fib_lookup(struct net *net, struct flowi4 *flp4,
    struct mr_table **mrt)
    {
    - struct ipmr_result res;
    - struct fib_lookup_arg arg = { .result = &res, };
    int err;
    + struct ipmr_result res;
    + struct fib_lookup_arg arg = {
    + .result = &res,
    + .flags = FIB_LOOKUP_NOREF,
    + };

    err = fib_rules_lookup(net->ipv4.mr_rules_ops,
    flowi4_to_flowi(flp4), 0, &arg);
    diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
    index 03986d3..0caf013 100644
    --- a/net/ipv6/ip6mr.c
    +++ b/net/ipv6/ip6mr.c
    @@ -141,9 +141,12 @@ static struct mr6_table *ip6mr_get_table(struct net *net, u32 id)
    static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6,
    struct mr6_table **mrt)
    {
    - struct ip6mr_result res;
    - struct fib_lookup_arg arg = { .result = &res, };
    int err;
    + struct ip6mr_result res;
    + struct fib_lookup_arg arg = {
    + .result = &res,
    + .flags = FIB_LOOKUP_NOREF,
    + };

    err = fib_rules_lookup(net->ipv6.mr6_rules_ops,
    flowi6_to_flowi(flp6), 0, &arg);
    --
    1.8.3.2


    \
     
     \ /
      Last update: 2014-02-07 13:41    [W:4.092 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site