summaryrefslogtreecommitdiffstats
path: root/kernel/audit_tree.c
diff options
context:
space:
mode:
authorElena Reshetova <elena.reshetova@intel.com>2017-05-02 10:16:04 -0400
committerPaul Moore <paul@paul-moore.com>2017-05-02 10:16:04 -0400
commit9d2378f8c8f1a3fcfab681fd90c139d90dca7b69 (patch)
tree0c11cc5d48fbd6d44c6dd593b8ebdfa07f8adad2 /kernel/audit_tree.c
parent2173c519d5e912a6e2934bb04255fcd36c1591c8 (diff)
audit: convert audit_tree.count 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> [PM: fix subject line, add #include] Signed-off-by: Paul Moore <paul@paul-moore.com>
Diffstat (limited to 'kernel/audit_tree.c')
-rw-r--r--kernel/audit_tree.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c
index 7b44195da81b..5cfd1ea18de0 100644
--- a/kernel/audit_tree.c
+++ b/kernel/audit_tree.c
@@ -3,13 +3,14 @@
3#include <linux/namei.h> 3#include <linux/namei.h>
4#include <linux/mount.h> 4#include <linux/mount.h>
5#include <linux/kthread.h> 5#include <linux/kthread.h>
6#include <linux/refcount.h>
6#include <linux/slab.h> 7#include <linux/slab.h>
7 8
8struct audit_tree; 9struct audit_tree;
9struct audit_chunk; 10struct audit_chunk;
10 11
11struct audit_tree { 12struct audit_tree {
12 atomic_t count; 13 refcount_t count;
13 int goner; 14 int goner;
14 struct audit_chunk *root; 15 struct audit_chunk *root;
15 struct list_head chunks; 16 struct list_head chunks;
@@ -77,7 +78,7 @@ static struct audit_tree *alloc_tree(const char *s)
77 78
78 tree = kmalloc(sizeof(struct audit_tree) + strlen(s) + 1, GFP_KERNEL); 79 tree = kmalloc(sizeof(struct audit_tree) + strlen(s) + 1, GFP_KERNEL);
79 if (tree) { 80 if (tree) {
80 atomic_set(&tree->count, 1); 81 refcount_set(&tree->count, 1);
81 tree->goner = 0; 82 tree->goner = 0;
82 INIT_LIST_HEAD(&tree->chunks); 83 INIT_LIST_HEAD(&tree->chunks);
83 INIT_LIST_HEAD(&tree->rules); 84 INIT_LIST_HEAD(&tree->rules);
@@ -91,12 +92,12 @@ static struct audit_tree *alloc_tree(const char *s)
91 92
92static inline void get_tree(struct audit_tree *tree) 93static inline void get_tree(struct audit_tree *tree)
93{ 94{
94 atomic_inc(&tree->count); 95 refcount_inc(&tree->count);
95} 96}
96 97
97static inline void put_tree(struct audit_tree *tree) 98static inline void put_tree(struct audit_tree *tree)
98{ 99{
99 if (atomic_dec_and_test(&tree->count)) 100 if (refcount_dec_and_test(&tree->count))
100 kfree_rcu(tree, head); 101 kfree_rcu(tree, head);
101} 102}
102 103