[PATCH 5/5] arm64: compat: Poison the compat sigpage

Vincenzo Frascino vincenzo.frascino at arm.com
Thu Mar 18 18:13:53 GMT 2021


On 3/18/21 5:07 PM, Will Deacon wrote:
> 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 at kernel.org>

Reviewed-by: Vincenzo Frascino <vincenzo.frascino at arm.com>

> ---
>  arch/arm64/kernel/vdso.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
> index 16bf0b46fb70..159b72a646ab 100644
> --- a/arch/arm64/kernel/vdso.c
> +++ b/arch/arm64/kernel/vdso.c
> @@ -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;
>  }
> 

-- 
Regards,
Vincenzo



More information about the linux-arm-kernel mailing list