diff options
author | Reshetova, Elena <elena.reshetova@intel.com> | 2017-07-04 08:53:02 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-07-04 17:35:16 -0400 |
commit | 788936641ac8bc92c531f09b79bf44775fac1350 (patch) | |
tree | 2e7a55d6a17897f390bfd19612231c7d672e6c33 /net/atm | |
parent | 458bc30cec26c2716746ae215ed23773257e417d (diff) |
net, atm: convert lec_arp_table.usage 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>
Diffstat (limited to 'net/atm')
-rw-r--r-- | net/atm/lec.c | 6 | ||||
-rw-r--r-- | net/atm/lec_arpc.h | 2 |
2 files changed, 4 insertions, 4 deletions
diff --git a/net/atm/lec.c b/net/atm/lec.c index 75545717fa46..093fe8707731 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c | |||
@@ -101,12 +101,12 @@ static void lec_vcc_close(struct lec_priv *priv, struct atm_vcc *vcc); | |||
101 | /* must be done under lec_arp_lock */ | 101 | /* must be done under lec_arp_lock */ |
102 | static inline void lec_arp_hold(struct lec_arp_table *entry) | 102 | static inline void lec_arp_hold(struct lec_arp_table *entry) |
103 | { | 103 | { |
104 | atomic_inc(&entry->usage); | 104 | refcount_inc(&entry->usage); |
105 | } | 105 | } |
106 | 106 | ||
107 | static inline void lec_arp_put(struct lec_arp_table *entry) | 107 | static inline void lec_arp_put(struct lec_arp_table *entry) |
108 | { | 108 | { |
109 | if (atomic_dec_and_test(&entry->usage)) | 109 | if (refcount_dec_and_test(&entry->usage)) |
110 | kfree(entry); | 110 | kfree(entry); |
111 | } | 111 | } |
112 | 112 | ||
@@ -1564,7 +1564,7 @@ static struct lec_arp_table *make_entry(struct lec_priv *priv, | |||
1564 | to_return->last_used = jiffies; | 1564 | to_return->last_used = jiffies; |
1565 | to_return->priv = priv; | 1565 | to_return->priv = priv; |
1566 | skb_queue_head_init(&to_return->tx_wait); | 1566 | skb_queue_head_init(&to_return->tx_wait); |
1567 | atomic_set(&to_return->usage, 1); | 1567 | refcount_set(&to_return->usage, 1); |
1568 | return to_return; | 1568 | return to_return; |
1569 | } | 1569 | } |
1570 | 1570 | ||
diff --git a/net/atm/lec_arpc.h b/net/atm/lec_arpc.h index ec67435a40a6..d923f53812a3 100644 --- a/net/atm/lec_arpc.h +++ b/net/atm/lec_arpc.h | |||
@@ -47,7 +47,7 @@ struct lec_arp_table { | |||
47 | * the length of the tlvs array | 47 | * the length of the tlvs array |
48 | */ | 48 | */ |
49 | struct sk_buff_head tx_wait; /* wait queue for outgoing packets */ | 49 | struct sk_buff_head tx_wait; /* wait queue for outgoing packets */ |
50 | atomic_t usage; /* usage count */ | 50 | refcount_t usage; /* usage count */ |
51 | }; | 51 | }; |
52 | 52 | ||
53 | /* | 53 | /* |