Merge tag 'mm-stable-2023-02-20-13-37' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / mm / kasan / report_sw_tags.c
index 7a26397297edb133e4aa8a20986d2c924fe40fdb..8b1f5a73ee6d33bd85114089db2c0e6f95187893 100644 (file)
@@ -45,6 +45,32 @@ void *kasan_find_first_bad_addr(void *addr, size_t size)
        return p;
 }
 
+size_t kasan_get_alloc_size(void *object, struct kmem_cache *cache)
+{
+       size_t size = 0;
+       u8 *shadow;
+
+       /*
+        * Skip the addr_has_metadata check, as this function only operates on
+        * slab memory, which must have metadata.
+        */
+
+       /*
+        * The loop below returns 0 for freed objects, for which KASAN cannot
+        * calculate the allocation size based on the metadata.
+        */
+       shadow = (u8 *)kasan_mem_to_shadow(object);
+       while (size < cache->object_size) {
+               if (*shadow != KASAN_TAG_INVALID)
+                       size += KASAN_GRANULE_SIZE;
+               else
+                       return size;
+               shadow++;
+       }
+
+       return cache->object_size;
+}
+
 void kasan_metadata_fetch_row(char *buffer, void *row)
 {
        memcpy(buffer, kasan_mem_to_shadow(row), META_BYTES_PER_ROW);