mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
kasan, mm, arm64: tag non slab memory allocated via pagealloc
Tag-based KASAN doesn't check memory accesses through pointers tagged with 0xff. When page_address is used to get pointer to memory that corresponds to some page, the tag of the resulting pointer gets set to 0xff, even though the allocated memory might have been tagged differently. For slab pages it's impossible to recover the correct tag to return from page_address, since the page might contain multiple slab objects tagged with different values, and we can't know in advance which one of them is going to get accessed. For non slab pages however, we can recover the tag in page_address, since the whole page was marked with the same tag. This patch adds tagging to non slab memory allocated with pagealloc. To set the tag of the pointer returned from page_address, the tag gets stored to page->flags when the memory gets allocated. Link: http://lkml.kernel.org/r/d758ddcef46a5abc9970182b9137e2fbee202a2c.1544099024.git.andreyknvl@google.com Signed-off-by: Andrey Konovalov <[email protected]> Reviewed-by: Andrey Ryabinin <[email protected]> Reviewed-by: Dmitry Vyukov <[email protected]> Acked-by: Will Deacon <[email protected]> Cc: Christoph Lameter <[email protected]> Cc: Mark Rutland <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
41eea9cd23
commit
2813b9c029
7 changed files with 72 additions and 4 deletions
11
mm/cma.c
11
mm/cma.c
|
|
@ -407,6 +407,7 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align,
|
|||
unsigned long pfn = -1;
|
||||
unsigned long start = 0;
|
||||
unsigned long bitmap_maxno, bitmap_no, bitmap_count;
|
||||
size_t i;
|
||||
struct page *page = NULL;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
|
|
@ -466,6 +467,16 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align,
|
|||
|
||||
trace_cma_alloc(pfn, page, count, align);
|
||||
|
||||
/*
|
||||
* CMA can allocate multiple page blocks, which results in different
|
||||
* blocks being marked with different tags. Reset the tags to ignore
|
||||
* those page blocks.
|
||||
*/
|
||||
if (page) {
|
||||
for (i = 0; i < count; i++)
|
||||
page_kasan_tag_reset(page + i);
|
||||
}
|
||||
|
||||
if (ret && !no_warn) {
|
||||
pr_err("%s: alloc failed, req-size: %zu pages, ret: %d\n",
|
||||
__func__, count, ret);
|
||||
|
|
|
|||
Loading…
Reference in a new issue