arm64: compat: Poison the compat sigpage
authorWill Deacon <will@kernel.org>
Thu, 18 Mar 2021 17:07:38 +0000 (17:07 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Wed, 24 Mar 2021 16:48:41 +0000 (16:48 +0000)
Commit 9c698bff66ab ("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>
arch/arm64/kernel/vdso.c

index 16bf0b4..159b72a 100644 (file)
@@ -318,17 +318,20 @@ static int aarch32_alloc_kuser_vdso_page(void)
        return 0;
 }
 
+#define COMPAT_SIGPAGE_POISON_WORD     0xe7fddef1
 static int aarch32_alloc_sigpage(void)
 {
        extern char __aarch32_sigret_code_start[], __aarch32_sigret_code_end[];
        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)
                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);
        return 0;
 }