ipv4: convert dst_metrics.refcnt from atomic_t to refcount_t
refcount_t type and corresponding API should be used instead of atomic_t when the variable is used as a reference counter. This allows to avoid accidental refcounter overflows that might lead to use-after-free situations. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
633cefe390
commit
9620fef27e
@@ -1398,7 +1398,7 @@ static void ipv4_dst_destroy(struct dst_entry *dst)
|
||||
struct dst_metrics *p = (struct dst_metrics *)DST_METRICS_PTR(dst);
|
||||
struct rtable *rt = (struct rtable *) dst;
|
||||
|
||||
if (p != &dst_default_metrics && atomic_dec_and_test(&p->refcnt))
|
||||
if (p != &dst_default_metrics && refcount_dec_and_test(&p->refcnt))
|
||||
kfree(p);
|
||||
|
||||
if (!list_empty(&rt->rt_uncached)) {
|
||||
@@ -1456,7 +1456,7 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
|
||||
dst_init_metrics(&rt->dst, fi->fib_metrics->metrics, true);
|
||||
if (fi->fib_metrics != &dst_default_metrics) {
|
||||
rt->dst._metrics |= DST_METRICS_REFCOUNTED;
|
||||
atomic_inc(&fi->fib_metrics->refcnt);
|
||||
refcount_inc(&fi->fib_metrics->refcnt);
|
||||
}
|
||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||
rt->dst.tclassid = nh->nh_tclassid;
|
||||
|
Reference in New Issue
Block a user