Skip to content

Commit e6aed04

Browse files
committed
Revert "net/ipv6: fix metrics leak"
This reverts commit df18b50. This change causes other problems and use-after-free situations as found by syzbot. Signed-off-by: David S. Miller <[email protected]>
1 parent c01f6c9 commit e6aed04

File tree

1 file changed

+4
-14
lines changed

1 file changed

+4
-14
lines changed

net/ipv6/ip6_fib.c

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -167,22 +167,11 @@ struct fib6_info *fib6_info_alloc(gfp_t gfp_flags)
167167
return f6i;
168168
}
169169

170-
static void fib6_metrics_release(struct fib6_info *f6i)
171-
{
172-
struct dst_metrics *m;
173-
174-
if (!f6i)
175-
return;
176-
177-
m = f6i->fib6_metrics;
178-
if (m != &dst_default_metrics && refcount_dec_and_test(&m->refcnt))
179-
kfree(m);
180-
}
181-
182170
void fib6_info_destroy_rcu(struct rcu_head *head)
183171
{
184172
struct fib6_info *f6i = container_of(head, struct fib6_info, rcu);
185173
struct rt6_exception_bucket *bucket;
174+
struct dst_metrics *m;
186175

187176
WARN_ON(f6i->fib6_node);
188177

@@ -212,7 +201,9 @@ void fib6_info_destroy_rcu(struct rcu_head *head)
212201
if (f6i->fib6_nh.nh_dev)
213202
dev_put(f6i->fib6_nh.nh_dev);
214203

215-
fib6_metrics_release(f6i);
204+
m = f6i->fib6_metrics;
205+
if (m != &dst_default_metrics && refcount_dec_and_test(&m->refcnt))
206+
kfree(m);
216207

217208
kfree(f6i);
218209
}
@@ -896,7 +887,6 @@ static void fib6_drop_pcpu_from(struct fib6_info *f6i,
896887

897888
from = rcu_dereference_protected(pcpu_rt->from,
898889
lockdep_is_held(&table->tb6_lock));
899-
fib6_metrics_release(from);
900890
rcu_assign_pointer(pcpu_rt->from, NULL);
901891
fib6_info_release(from);
902892
}

0 commit comments

Comments
 (0)