It seems we dont use appropriate refcount increment in an
rcu_read_lock() protected section.
fib_rule_get() might increment a null refcount and bad things could
happen.
While fib_nl_delrule() respects an rcu grace period before calling
fib_rule_put(), fib_rules_cleanup_ops() calls fib_rule_put() without a
grace period.
Note : after this patch, we might avoid the synchronize_rcu() call done
in fib_nl_delrule()
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
                        err = ops->action(rule, fl, flags, arg);
 
                if (err != -EAGAIN) {
-                       fib_rule_get(rule);
-                       arg->rule = rule;
-                       goto out;
+                       if (likely(atomic_inc_not_zero(&rule->refcnt))) {
+                               arg->rule = rule;
+                               goto out;
+                       }
+                       break;
                }
        }