kasan: ensure poisoning size alignment
[linux-2.6-microblaze.git] / mm / kasan / common.c
index 1e51064..dec7375 100644 (file)
@@ -261,7 +261,8 @@ void __kasan_unpoison_object_data(struct kmem_cache *cache, void *object)
 
 void __kasan_poison_object_data(struct kmem_cache *cache, void *object)
 {
-       kasan_poison(object, cache->object_size, KASAN_KMALLOC_REDZONE);
+       kasan_poison(object, round_up(cache->object_size, KASAN_GRANULE_SIZE),
+                       KASAN_KMALLOC_REDZONE);
 }
 
 /*
@@ -348,7 +349,8 @@ static bool ____kasan_slab_free(struct kmem_cache *cache, void *object,
                return true;
        }
 
-       kasan_poison(object, cache->object_size, KASAN_KMALLOC_FREE);
+       kasan_poison(object, round_up(cache->object_size, KASAN_GRANULE_SIZE),
+                       KASAN_KMALLOC_FREE);
 
        if ((IS_ENABLED(CONFIG_KASAN_GENERIC) && !quarantine))
                return false;
@@ -490,7 +492,8 @@ static void *____kasan_kmalloc(struct kmem_cache *cache, const void *object,
        /* Poison the aligned part of the redzone. */
        redzone_start = round_up((unsigned long)(object + size),
                                KASAN_GRANULE_SIZE);
-       redzone_end = (unsigned long)object + cache->object_size;
+       redzone_end = round_up((unsigned long)(object + cache->object_size),
+                               KASAN_GRANULE_SIZE);
        kasan_poison((void *)redzone_start, redzone_end - redzone_start,
                           KASAN_KMALLOC_REDZONE);