net, ipv6: convert ifacaddr6.aca_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: Elena Reshetova <elena.reshetova@intel.com> Signed-off-by: Hans Liljestrand <ishkamiel@gmail.com> Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: David Windsor <dwindsor@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d3981bc615
commit
affa78bc6a
|
@ -147,7 +147,7 @@ struct ifacaddr6 {
|
|||
struct rt6_info *aca_rt;
|
||||
struct ifacaddr6 *aca_next;
|
||||
int aca_users;
|
||||
atomic_t aca_refcnt;
|
||||
refcount_t aca_refcnt;
|
||||
unsigned long aca_cstamp;
|
||||
unsigned long aca_tstamp;
|
||||
};
|
||||
|
|
|
@ -203,12 +203,12 @@ void ipv6_sock_ac_close(struct sock *sk)
|
|||
|
||||
static void aca_get(struct ifacaddr6 *aca)
|
||||
{
|
||||
atomic_inc(&aca->aca_refcnt);
|
||||
refcount_inc(&aca->aca_refcnt);
|
||||
}
|
||||
|
||||
static void aca_put(struct ifacaddr6 *ac)
|
||||
{
|
||||
if (atomic_dec_and_test(&ac->aca_refcnt)) {
|
||||
if (refcount_dec_and_test(&ac->aca_refcnt)) {
|
||||
in6_dev_put(ac->aca_idev);
|
||||
dst_release(&ac->aca_rt->dst);
|
||||
kfree(ac);
|
||||
|
@ -232,7 +232,7 @@ static struct ifacaddr6 *aca_alloc(struct rt6_info *rt,
|
|||
aca->aca_users = 1;
|
||||
/* aca_tstamp should be updated upon changes */
|
||||
aca->aca_cstamp = aca->aca_tstamp = jiffies;
|
||||
atomic_set(&aca->aca_refcnt, 1);
|
||||
refcount_set(&aca->aca_refcnt, 1);
|
||||
|
||||
return aca;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue