Re: [RFC 1/2] x86/mm/cpa: always fail when user address is passed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2022-06-14 at 15:39 +0900, Hyeonggon Yoo wrote:
> Currently CPA is not used for user mappings (only pgd of init_mm
> or and efi_mm is used). For simplicity, always fail when user address
> is passed.
> 
> Note that efi_mm uses 1:1 mapping so its address should not be
> considered as user address.
> 
> Signed-off-by: Hyeonggon Yoo <42.hyeyoo@xxxxxxxxx>
> ---
>  arch/x86/mm/pat/set_memory.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/arch/x86/mm/pat/set_memory.c
> b/arch/x86/mm/pat/set_memory.c
> index 1abd5438f126..67cf969fed0d 100644
> --- a/arch/x86/mm/pat/set_memory.c
> +++ b/arch/x86/mm/pat/set_memory.c
> @@ -20,6 +20,7 @@
>  #include <linux/kernel.h>
>  #include <linux/cc_platform.h>
>  #include <linux/set_memory.h>
> +#include <linux/efi.h>
>  
>  #include <asm/e820/api.h>
>  #include <asm/processor.h>
> @@ -1514,6 +1515,11 @@ static int __change_page_attr(struct cpa_data
> *cpa, int primary)

I guess having it here instead of __change_page_attr_set_clr() will
result in the direct map alias addresses getting checked as well. Since
these are determined inside of CPA, I'm not sure if it's needed as
much.

>  	pte_t *kpte, old_pte;
>  
>  	address = __cpa_addr(cpa, cpa->curpage);
> +
> +	if (WARN((IS_ENABLED(CONFIG_EFI) ? cpa->pgd != efi_mm.pgd :
> true)

Could it be?

(!IS_ENABLED(CONFIG_EFI) || cpa->pgd != efi_mm.pgd)


> +		  && address <= TASK_SIZE_MAX,
> +		 KERN_WARNING "CPA: Got a user address"))
> +		return -EINVAL;
>  repeat:
>  	kpte = _lookup_address_cpa(cpa, address, &level);
>  	if (!kpte)




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux