diff mbox

[V2,04/10] kasan: Don't use kasan shadow pointer in generic functions

Message ID 87mvxectv1.fsf@linux.vnet.ibm.com (mailing list archive)
State Not Applicable
Headers show

Commit Message

Aneesh Kumar K.V Aug. 26, 2015, 8:54 a.m. UTC
Missed to cherry-pick the updated version of this patch, before sending
the series out.

commit aeb324e09d95c189eda4ce03790da94b535d1dfc
Author: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Date:   Fri Aug 14 12:28:58 2015 +0530

    kasan: Don't use kasan shadow pointer in generic functions
    
    We can't use generic functions like print_hex_dump to access kasan
    shadow region. This require us to setup another kasan shadow region
    for the address passed (kasan shadow address). Most architecture won't
    be able to do that. Hence make a copy of the shadow region row and
    pass that to generic functions.
    
    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Comments

Andrey Ryabinin Aug. 27, 2015, 9:42 a.m. UTC | #1
2015-08-26 11:54 GMT+03:00 Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>:
>
> Missed to cherry-pick the updated version of this patch, before sending
> the series out.
>
> commit aeb324e09d95c189eda4ce03790da94b535d1dfc
> Author: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> Date:   Fri Aug 14 12:28:58 2015 +0530
>
>     kasan: Don't use kasan shadow pointer in generic functions
>
>     We can't use generic functions like print_hex_dump to access kasan
>     shadow region. This require us to setup another kasan shadow region
>     for the address passed (kasan shadow address). Most architecture won't
>     be able to do that. Hence make a copy of the shadow region row and
>     pass that to generic functions.
>
>     Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
>
> diff --git a/mm/kasan/report.c b/mm/kasan/report.c
> index d19d01823a68..60fdb0413f3b 100644
> --- a/mm/kasan/report.c
> +++ b/mm/kasan/report.c
> @@ -166,14 +166,20 @@ static void print_shadow_for_address(const void *addr)
>         for (i = -SHADOW_ROWS_AROUND_ADDR; i <= SHADOW_ROWS_AROUND_ADDR; i++) {
>                 const void *kaddr = kasan_shadow_to_mem(shadow_row);
>                 char buffer[4 + (BITS_PER_LONG/8)*2];
> +               char shadow_buf[SHADOW_BYTES_PER_ROW];
>
>                 snprintf(buffer, sizeof(buffer),
>                         (i == 0) ? ">%p: " : " %p: ", kaddr);
> -
> +               /*
> +                * We should not pass a shadow pointer to generic
> +                * function, because generic functions may try to
> +                * kasan mapping for the passed address.

may try to *access* kasan mapping?

> +                */
> +               memcpy(shadow_buf, shadow_row, SHADOW_BYTES_PER_ROW);
>                 kasan_disable_current();
>                 print_hex_dump(KERN_ERR, buffer,
>                         DUMP_PREFIX_NONE, SHADOW_BYTES_PER_ROW, 1,
> -                       shadow_row, SHADOW_BYTES_PER_ROW, 0);
> +                       shadow_buf, SHADOW_BYTES_PER_ROW, 0);
>                 kasan_enable_current();
>
>                 if (row_is_guilty(shadow_row, shadow))
>
diff mbox

Patch

diff --git a/mm/kasan/report.c b/mm/kasan/report.c
index d19d01823a68..60fdb0413f3b 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -166,14 +166,20 @@  static void print_shadow_for_address(const void *addr)
 	for (i = -SHADOW_ROWS_AROUND_ADDR; i <= SHADOW_ROWS_AROUND_ADDR; i++) {
 		const void *kaddr = kasan_shadow_to_mem(shadow_row);
 		char buffer[4 + (BITS_PER_LONG/8)*2];
+		char shadow_buf[SHADOW_BYTES_PER_ROW];
 
 		snprintf(buffer, sizeof(buffer),
 			(i == 0) ? ">%p: " : " %p: ", kaddr);
-
+		/*
+		 * We should not pass a shadow pointer to generic
+		 * function, because generic functions may try to
+		 * kasan mapping for the passed address.
+		 */
+		memcpy(shadow_buf, shadow_row, SHADOW_BYTES_PER_ROW);
 		kasan_disable_current();
 		print_hex_dump(KERN_ERR, buffer,
 			DUMP_PREFIX_NONE, SHADOW_BYTES_PER_ROW, 1,
-			shadow_row, SHADOW_BYTES_PER_ROW, 0);
+			shadow_buf, SHADOW_BYTES_PER_ROW, 0);
 		kasan_enable_current();
 
 		if (row_is_guilty(shadow_row, shadow))