net: convert net.passive 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
edcb691871
commit
c122e14df2
3 changed files with 5 additions and 4 deletions
|
@ -5,6 +5,7 @@
|
|||
#define __NET_NET_NAMESPACE_H
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/sysctl.h>
|
||||
|
@ -46,7 +47,7 @@ struct netns_ipvs;
|
|||
#define NETDEV_HASHENTRIES (1 << NETDEV_HASHBITS)
|
||||
|
||||
struct net {
|
||||
atomic_t passive; /* To decided when the network
|
||||
refcount_t passive; /* To decided when the network
|
||||
* namespace should be freed.
|
||||
*/
|
||||
atomic_t count; /* To decided when the network
|
||||
|
|
|
@ -1448,7 +1448,7 @@ static void *net_grab_current_ns(void)
|
|||
struct net *ns = current->nsproxy->net_ns;
|
||||
#ifdef CONFIG_NET_NS
|
||||
if (ns)
|
||||
atomic_inc(&ns->passive);
|
||||
refcount_inc(&ns->passive);
|
||||
#endif
|
||||
return ns;
|
||||
}
|
||||
|
|
|
@ -284,7 +284,7 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
|
|||
LIST_HEAD(net_exit_list);
|
||||
|
||||
atomic_set(&net->count, 1);
|
||||
atomic_set(&net->passive, 1);
|
||||
refcount_set(&net->passive, 1);
|
||||
net->dev_base_seq = 1;
|
||||
net->user_ns = user_ns;
|
||||
idr_init(&net->netns_ids);
|
||||
|
@ -380,7 +380,7 @@ static void net_free(struct net *net)
|
|||
void net_drop_ns(void *p)
|
||||
{
|
||||
struct net *ns = p;
|
||||
if (ns && atomic_dec_and_test(&ns->passive))
|
||||
if (ns && refcount_dec_and_test(&ns->passive))
|
||||
net_free(ns);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue