net: convert sock.sk_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. This patch uses refcount_inc_not_zero() instead of atomic_inc_not_zero_hint() due to absense of a _hint() version of refcount API. If the hint() version must be used, we might need to revisit API. 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>
このコミットが含まれているのは:
@@ -76,7 +76,7 @@ void inet_twsk_free(struct inet_timewait_sock *tw)
|
||||
|
||||
void inet_twsk_put(struct inet_timewait_sock *tw)
|
||||
{
|
||||
if (atomic_dec_and_test(&tw->tw_refcnt))
|
||||
if (refcount_dec_and_test(&tw->tw_refcnt))
|
||||
inet_twsk_free(tw);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(inet_twsk_put);
|
||||
@@ -131,7 +131,7 @@ void __inet_twsk_hashdance(struct inet_timewait_sock *tw, struct sock *sk,
|
||||
* We can use atomic_set() because prior spin_lock()/spin_unlock()
|
||||
* committed into memory all tw fields.
|
||||
*/
|
||||
atomic_set(&tw->tw_refcnt, 4);
|
||||
refcount_set(&tw->tw_refcnt, 4);
|
||||
inet_twsk_add_node_rcu(tw, &ehead->chain);
|
||||
|
||||
/* Step 3: Remove SK from hash chain */
|
||||
@@ -195,7 +195,7 @@ struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk,
|
||||
* to a non null value before everything is setup for this
|
||||
* timewait socket.
|
||||
*/
|
||||
atomic_set(&tw->tw_refcnt, 0);
|
||||
refcount_set(&tw->tw_refcnt, 0);
|
||||
|
||||
__module_get(tw->tw_prot->owner);
|
||||
}
|
||||
@@ -278,7 +278,7 @@ restart:
|
||||
atomic_read(&twsk_net(tw)->count))
|
||||
continue;
|
||||
|
||||
if (unlikely(!atomic_inc_not_zero(&tw->tw_refcnt)))
|
||||
if (unlikely(!refcount_inc_not_zero(&tw->tw_refcnt)))
|
||||
continue;
|
||||
|
||||
if (unlikely((tw->tw_family != family) ||
|
||||
|
新しいイシューから参照
ユーザーをブロックする