diff options
author | Elena Reshetova <elena.reshetova@intel.com> | 2017-05-02 10:16:04 -0400 |
---|---|---|
committer | Paul Moore <paul@paul-moore.com> | 2017-05-02 10:16:04 -0400 |
commit | 9d2378f8c8f1a3fcfab681fd90c139d90dca7b69 (patch) | |
tree | 0c11cc5d48fbd6d44c6dd593b8ebdfa07f8adad2 /kernel/audit_tree.c | |
parent | 2173c519d5e912a6e2934bb04255fcd36c1591c8 (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.c | 9 |
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 | ||
8 | struct audit_tree; | 9 | struct audit_tree; |
9 | struct audit_chunk; | 10 | struct audit_chunk; |
10 | 11 | ||
11 | struct audit_tree { | 12 | struct 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 | ||
92 | static inline void get_tree(struct audit_tree *tree) | 93 | static inline void get_tree(struct audit_tree *tree) |
93 | { | 94 | { |
94 | atomic_inc(&tree->count); | 95 | refcount_inc(&tree->count); |
95 | } | 96 | } |
96 | 97 | ||
97 | static inline void put_tree(struct audit_tree *tree) | 98 | static 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 | ||