s390/kasan: fix insecure W+X mapping warning
Since commit 3b5c3f000c2e ("s390/kasan: move shadow mapping
to decompressor") the decompressor establishes mappings for
the shadow memory and sets initial protection attributes to
RWX. The decompressed kernel resets protection to RW+NX
later on.
In case a shadow memory range is not aligned on page boundary
(e.g. as result of mem= kernel command line parameter use),
the "Checked W+X mappings: FAILED, 1 W+X pages found" warning
hits.
Reported-by: Vasily Gorbik <gor@linux.ibm.com>
Fixes: 557b19709d
("s390/kasan: move shadow mapping to decompressor")
Reviewed-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
This commit is contained in:
parent
f471c6585c
commit
2ed8b50975
|
@ -667,7 +667,15 @@ static void __init memblock_region_swap(void *a, void *b, int size)
|
||||||
|
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
#define __sha(x) ((unsigned long)kasan_mem_to_shadow((void *)x))
|
#define __sha(x) ((unsigned long)kasan_mem_to_shadow((void *)x))
|
||||||
|
|
||||||
|
static inline int set_memory_kasan(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
start = PAGE_ALIGN_DOWN(__sha(start));
|
||||||
|
end = PAGE_ALIGN(__sha(end));
|
||||||
|
return set_memory_rwnx(start, (end - start) >> PAGE_SHIFT);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* map whole physical memory to virtual memory (identity mapping)
|
* map whole physical memory to virtual memory (identity mapping)
|
||||||
* we reserve enough space in the vmalloc area for vmemmap to hotplug
|
* we reserve enough space in the vmalloc area for vmemmap to hotplug
|
||||||
|
@ -737,10 +745,8 @@ void __init vmem_map_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
for_each_mem_range(i, &base, &end) {
|
for_each_mem_range(i, &base, &end)
|
||||||
set_memory_rwnx(__sha(base),
|
set_memory_kasan(base, end);
|
||||||
(__sha(end) - __sha(base)) >> PAGE_SHIFT);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
set_memory_rox((unsigned long)_stext,
|
set_memory_rox((unsigned long)_stext,
|
||||||
(unsigned long)(_etext - _stext) >> PAGE_SHIFT);
|
(unsigned long)(_etext - _stext) >> PAGE_SHIFT);
|
||||||
|
|
Loading…
Reference in New Issue