mm/kasan: don't use kasan shadow pointer in generic functions
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Fri, 6 Nov 2015 02:50:48 +0000 (18:50 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Nov 2015 03:34:48 +0000 (19:34 -0800)
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).  Some architectures 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>
Reviewed-by: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/kasan/report.c

index d269f2087fafd819f35a7cc73bf9fe735c76b269..c5367089703c7bf7e879b05a44faf39f03b9223e 100644 (file)
@@ -164,14 +164,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
+                * access kasan mapping for the passed address.
+                */
                kasan_disable_current();
+               memcpy(shadow_buf, shadow_row, SHADOW_BYTES_PER_ROW);
                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))