apparmor: add kvzalloc to handle zeroing for kvmalloc
authorJohn Johansen <john.johansen@canonical.com>
Tue, 19 Feb 2013 00:04:34 +0000 (16:04 -0800)
committerJohn Johansen <john.johansen@canonical.com>
Sun, 28 Apr 2013 07:36:09 +0000 (00:36 -0700)
Signed-off-by: John Johansen <john.johansen@canonical.com>
Acked-by: Steve Beattie <sbeattie@ubuntu.com>
security/apparmor/include/apparmor.h
security/apparmor/lib.c
security/apparmor/match.c

index 40aedd9..1ba2ca5 100644 (file)
@@ -15,6 +15,7 @@
 #ifndef __APPARMOR_H
 #define __APPARMOR_H
 
+#include <linux/slab.h>
 #include <linux/fs.h>
 
 #include "match.h"
@@ -64,9 +65,18 @@ extern int apparmor_initialized __initdata;
 /* fn's in lib */
 char *aa_split_fqname(char *args, char **ns_name);
 void aa_info_message(const char *str);
-void *kvmalloc(size_t size);
+void *__aa_kvmalloc(size_t size, gfp_t flags);
 void kvfree(void *buffer);
 
+static inline void *kvmalloc(size_t size)
+{
+       return __aa_kvmalloc(size, 0);
+}
+
+static inline void *kvzalloc(size_t size)
+{
+       return __aa_kvmalloc(size, __GFP_ZERO);
+}
 
 /**
  * aa_strneq - compare null terminated @str to a non null terminated substring
index 7430298..d6e1f21 100644 (file)
@@ -75,15 +75,16 @@ void aa_info_message(const char *str)
 }
 
 /**
- * kvmalloc - do allocation preferring kmalloc but falling back to vmalloc
- * @size: size of allocation
+ * __aa_kvmalloc - do allocation preferring kmalloc but falling back to vmalloc
+ * @size: how many bytes of memory are required
+ * @flags: the type of memory to allocate (see kmalloc).
  *
  * Return: allocated buffer or NULL if failed
  *
  * It is possible that policy being loaded from the user is larger than
  * what can be allocated by kmalloc, in those cases fall back to vmalloc.
  */
-void *kvmalloc(size_t size)
+void *__aa_kvmalloc(size_t size, gfp_t flags)
 {
        void *buffer = NULL;
 
@@ -92,14 +93,17 @@ void *kvmalloc(size_t size)
 
        /* do not attempt kmalloc if we need more than 16 pages at once */
        if (size <= (16*PAGE_SIZE))
-               buffer = kmalloc(size, GFP_NOIO | __GFP_NOWARN);
+               buffer = kmalloc(size, flags | GFP_NOIO | __GFP_NOWARN);
        if (!buffer) {
                /* see kvfree for why size must be at least work_struct size
                 * when allocated via vmalloc
                 */
                if (size < sizeof(struct work_struct))
                        size = sizeof(struct work_struct);
-               buffer = vmalloc(size);
+               if (flags & __GFP_ZERO)
+                       buffer = vzalloc(size);
+               else
+                       buffer = vmalloc(size);
        }
        return buffer;
 }
index 90971a8..dfd25a9 100644 (file)
@@ -30,7 +30,7 @@
  *
  * Returns: pointer to table else NULL on failure
  *
- * NOTE: must be freed by kvfree (not kmalloc)
+ * NOTE: must be freed by kvfree (not kfree)
  */
 static struct table_header *unpack_table(char *blob, size_t bsize)
 {
@@ -57,7 +57,7 @@ static struct table_header *unpack_table(char *blob, size_t bsize)
        if (bsize < tsize)
                goto out;
 
-       table = kvmalloc(tsize);
+       table = kvzalloc(tsize);
        if (table) {
                *table = th;
                if (th.td_flags == YYTD_DATA8)