OSDN Git Service

kasan: simplify kasan_find_first_bad_addr call sites
authorAndrey Konovalov <andreyknvl@google.com>
Fri, 25 Mar 2022 01:12:46 +0000 (18:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 25 Mar 2022 02:06:49 +0000 (19:06 -0700)
Move the addr_has_metadata() check into kasan_find_first_bad_addr().

Link: https://lkml.kernel.org/r/a49576f7a23283d786ba61579cb0c5057e8f0b9b.1646237226.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Marco Elver <elver@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/kasan/report.c
mm/kasan/report_generic.c
mm/kasan/report_hw_tags.c
mm/kasan/report_sw_tags.c

index bb4c29b..a0d4a9d 100644 (file)
@@ -444,10 +444,7 @@ static void __kasan_report(void *addr, size_t size, bool is_write,
        start_report(&flags, true);
 
        info.access_addr = addr;
-       if (addr_has_metadata(addr))
-               info.first_bad_addr = kasan_find_first_bad_addr(addr, size);
-       else
-               info.first_bad_addr = addr;
+       info.first_bad_addr = kasan_find_first_bad_addr(addr, size);
        info.access_size = size;
        info.is_write = is_write;
        info.ip = ip;
index 7e03cca..182239c 100644 (file)
@@ -34,8 +34,12 @@ void *kasan_find_first_bad_addr(void *addr, size_t size)
 {
        void *p = addr;
 
+       if (!addr_has_metadata(p))
+               return p;
+
        while (p < addr + size && !(*(u8 *)kasan_mem_to_shadow(p)))
                p += KASAN_GRANULE_SIZE;
+
        return p;
 }
 
index 5dbbbb9..f3d3be6 100644 (file)
@@ -17,6 +17,7 @@
 
 void *kasan_find_first_bad_addr(void *addr, size_t size)
 {
+       /* Return the same value regardless of whether addr_has_metadata(). */
        return kasan_reset_tag(addr);
 }
 
index 7271f09..7a26397 100644 (file)
@@ -36,8 +36,12 @@ void *kasan_find_first_bad_addr(void *addr, size_t size)
        void *p = kasan_reset_tag(addr);
        void *end = p + size;
 
+       if (!addr_has_metadata(p))
+               return p;
+
        while (p < end && tag == *(u8 *)kasan_mem_to_shadow(p))
                p += KASAN_GRANULE_SIZE;
+
        return p;
 }