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

From: Catalin Marinas
Date: Tue Jan 19 2021 - 08:23:42 EST


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@xxxxxxxxxx>
> Cc: Andrey Ryabinin <aryabinin@xxxxxxxxxxxxx>
> Cc: Alexander Potapenko <glider@xxxxxxxxxx>
> Cc: Andrey Konovalov <andreyknvl@xxxxxxxxxx>
> Signed-off-by: Vincenzo Frascino <vincenzo.frascino@xxxxxxx>
> ---
> 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