[PATCH v4 3/5] kasan: Add report for async mode

Catalin Marinas catalin.marinas at arm.com
Tue Jan 19 08:04:40 EST 2021


On Mon, Jan 18, 2021 at 06:30:31PM +0000, Vincenzo Frascino wrote:
> KASAN provides an asynchronous mode of execution.
> 
> Add reporting functionality for this mode.
> 
> Cc: Dmitry Vyukov <dvyukov at google.com>
> Cc: Andrey Ryabinin <aryabinin at virtuozzo.com>
> Cc: Alexander Potapenko <glider at google.com>
> Cc: Andrey Konovalov <andreyknvl at google.com>
> Signed-off-by: Vincenzo Frascino <vincenzo.frascino at arm.com>
> ---
>  include/linux/kasan.h |  3 +++
>  mm/kasan/report.c     | 16 ++++++++++++++--
>  2 files changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/include/linux/kasan.h b/include/linux/kasan.h
> index fe1ae73ff8b5..8f43836ccdac 100644
> --- a/include/linux/kasan.h
> +++ b/include/linux/kasan.h
> @@ -336,6 +336,9 @@ static inline void *kasan_reset_tag(const void *addr)
>  bool kasan_report(unsigned long addr, size_t size,
>  		bool is_write, unsigned long ip);
>  
> +bool kasan_report_async(unsigned long addr, size_t size,
> +			bool is_write, unsigned long ip);

We have no address, no size and no is_write information. Do we have a
reason to pass all these arguments here? Not sure what SPARC ADI does
but they may not have all this information either. We can pass ip as the
point where we checked the TFSR reg but that's about it.

> +
>  #else /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS */
>  
>  static inline void *kasan_reset_tag(const void *addr)
> diff --git a/mm/kasan/report.c b/mm/kasan/report.c
> index c0fb21797550..946016ead6a9 100644
> --- a/mm/kasan/report.c
> +++ b/mm/kasan/report.c
> @@ -388,11 +388,11 @@ static void __kasan_report(unsigned long addr, size_t size, bool is_write,
>  	start_report(&flags);
>  
>  	print_error_description(&info);
> -	if (addr_has_metadata(untagged_addr))
> +	if (addr_has_metadata(untagged_addr) && (untagged_addr != 0))
>  		print_tags(get_tag(tagged_addr), info.first_bad_addr);
>  	pr_err("\n");
>  
> -	if (addr_has_metadata(untagged_addr)) {
> +	if (addr_has_metadata(untagged_addr) && (untagged_addr != 0)) {
>  		print_address_description(untagged_addr, get_tag(tagged_addr));
>  		pr_err("\n");
>  		print_memory_metadata(info.first_bad_addr);
> @@ -419,6 +419,18 @@ bool kasan_report(unsigned long addr, size_t size, bool is_write,
>  	return ret;
>  }
>  
> +bool kasan_report_async(unsigned long addr, size_t size,
> +			bool is_write, unsigned long ip)
> +{
> +	pr_info("==================================================================\n");
> +	pr_info("KASAN: set in asynchronous mode\n");
> +	pr_info("KASAN: some information might not be accurate\n");
> +	pr_info("KASAN: fault address is ignored\n");
> +	pr_info("KASAN: write/read distinction is ignored\n");
> +
> +	return kasan_report(addr, size, is_write, ip);

So just call kasan_report (0, 0, 0, ip) here.

-- 
Catalin



More information about the linux-arm-kernel mailing list