OSDN Git Service

Revert "net/ipv6: fix metrics leak"
authorDavid S. Miller <davem@davemloft.net>
Thu, 2 Aug 2018 04:32:30 +0000 (21:32 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 2 Aug 2018 04:32:30 +0000 (21:32 -0700)
This reverts commit df18b50448fab1dff093731dfd0e25e77e1afcd1.

This change causes other problems and use-after-free situations as
found by syzbot.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/ip6_fib.c

index 211a2d4..d212738 100644 (file)
@@ -167,22 +167,11 @@ struct fib6_info *fib6_info_alloc(gfp_t gfp_flags)
        return f6i;
 }
 
-static void fib6_metrics_release(struct fib6_info *f6i)
-{
-       struct dst_metrics *m;
-
-       if (!f6i)
-               return;
-
-       m = f6i->fib6_metrics;
-       if (m != &dst_default_metrics && refcount_dec_and_test(&m->refcnt))
-               kfree(m);
-}
-
 void fib6_info_destroy_rcu(struct rcu_head *head)
 {
        struct fib6_info *f6i = container_of(head, struct fib6_info, rcu);
        struct rt6_exception_bucket *bucket;
+       struct dst_metrics *m;
 
        WARN_ON(f6i->fib6_node);
 
@@ -212,7 +201,9 @@ void fib6_info_destroy_rcu(struct rcu_head *head)
        if (f6i->fib6_nh.nh_dev)
                dev_put(f6i->fib6_nh.nh_dev);
 
-       fib6_metrics_release(f6i);
+       m = f6i->fib6_metrics;
+       if (m != &dst_default_metrics && refcount_dec_and_test(&m->refcnt))
+               kfree(m);
 
        kfree(f6i);
 }
@@ -896,7 +887,6 @@ static void fib6_drop_pcpu_from(struct fib6_info *f6i,
 
                        from = rcu_dereference_protected(pcpu_rt->from,
                                             lockdep_is_held(&table->tb6_lock));
-                       fib6_metrics_release(from);
                        rcu_assign_pointer(pcpu_rt->from, NULL);
                        fib6_info_release(from);
                }