apparmor: add kvzalloc to handle zeroing for kvmalloc

Signed-off-by: John Johansen <john.johansen@canonical.com>
Acked-by: Steve Beattie <sbeattie@ubuntu.com>
This commit is contained in:
John Johansen 2013-02-18 16:04:34 -08:00
parent 3cfcc19e0b
commit 0ca554b9fc
3 changed files with 22 additions and 8 deletions

View File

@ -15,6 +15,7 @@
#ifndef __APPARMOR_H #ifndef __APPARMOR_H
#define __APPARMOR_H #define __APPARMOR_H
#include <linux/slab.h>
#include <linux/fs.h> #include <linux/fs.h>
#include "match.h" #include "match.h"
@ -64,9 +65,18 @@ extern int apparmor_initialized __initdata;
/* fn's in lib */ /* fn's in lib */
char *aa_split_fqname(char *args, char **ns_name); char *aa_split_fqname(char *args, char **ns_name);
void aa_info_message(const char *str); 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); 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 * aa_strneq - compare null terminated @str to a non null terminated substring

View File

@ -75,15 +75,16 @@ void aa_info_message(const char *str)
} }
/** /**
* kvmalloc - do allocation preferring kmalloc but falling back to vmalloc * __aa_kvmalloc - do allocation preferring kmalloc but falling back to vmalloc
* @size: size of allocation * @size: how many bytes of memory are required
* @flags: the type of memory to allocate (see kmalloc).
* *
* Return: allocated buffer or NULL if failed * Return: allocated buffer or NULL if failed
* *
* It is possible that policy being loaded from the user is larger than * 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. * 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; 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 */ /* do not attempt kmalloc if we need more than 16 pages at once */
if (size <= (16*PAGE_SIZE)) if (size <= (16*PAGE_SIZE))
buffer = kmalloc(size, GFP_NOIO | __GFP_NOWARN); buffer = kmalloc(size, flags | GFP_NOIO | __GFP_NOWARN);
if (!buffer) { if (!buffer) {
/* see kvfree for why size must be at least work_struct size /* see kvfree for why size must be at least work_struct size
* when allocated via vmalloc * when allocated via vmalloc
*/ */
if (size < sizeof(struct work_struct)) if (size < sizeof(struct work_struct))
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; return buffer;
} }

View File

@ -30,7 +30,7 @@
* *
* Returns: pointer to table else NULL on failure * 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) 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) if (bsize < tsize)
goto out; goto out;
table = kvmalloc(tsize); table = kvzalloc(tsize);
if (table) { if (table) {
*table = th; *table = th;
if (th.td_flags == YYTD_DATA8) if (th.td_flags == YYTD_DATA8)