arm64: compat: Poison the compat sigpage
Commit 9c698bff66
("ARM: ensure the signal page contains defined contents")
poisoned the unused portions of the signal page for 32-bit Arm.
Implement the same poisoning for the compat signal page on arm64 rather
than using __GFP_ZERO.
Signed-off-by: Will Deacon <will@kernel.org>
Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
Link: https://lore.kernel.org/r/20210318170738.7756-6-will@kernel.org
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
77ec462536
commit
6e554abd07
@ -318,17 +318,20 @@ static int aarch32_alloc_kuser_vdso_page(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define COMPAT_SIGPAGE_POISON_WORD 0xe7fddef1
|
||||||
static int aarch32_alloc_sigpage(void)
|
static int aarch32_alloc_sigpage(void)
|
||||||
{
|
{
|
||||||
extern char __aarch32_sigret_code_start[], __aarch32_sigret_code_end[];
|
extern char __aarch32_sigret_code_start[], __aarch32_sigret_code_end[];
|
||||||
int sigret_sz = __aarch32_sigret_code_end - __aarch32_sigret_code_start;
|
int sigret_sz = __aarch32_sigret_code_end - __aarch32_sigret_code_start;
|
||||||
unsigned long sigpage;
|
__le32 poison = cpu_to_le32(COMPAT_SIGPAGE_POISON_WORD);
|
||||||
|
void *sigpage;
|
||||||
|
|
||||||
sigpage = get_zeroed_page(GFP_KERNEL);
|
sigpage = (void *)__get_free_page(GFP_KERNEL);
|
||||||
if (!sigpage)
|
if (!sigpage)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
memcpy((void *)sigpage, __aarch32_sigret_code_start, sigret_sz);
|
memset32(sigpage, (__force u32)poison, PAGE_SIZE / sizeof(poison));
|
||||||
|
memcpy(sigpage, __aarch32_sigret_code_start, sigret_sz);
|
||||||
aarch32_sig_page = virt_to_page(sigpage);
|
aarch32_sig_page = virt_to_page(sigpage);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user