forked from Minki/linux
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:
parent
3cfcc19e0b
commit
0ca554b9fc
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user