0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/init.h>
0010 #include <linux/kasan.h>
0011 #include <linux/kernel.h>
0012 #include <linux/memory.h>
0013 #include <linux/mm.h>
0014 #include <linux/static_key.h>
0015 #include <linux/string.h>
0016 #include <linux/types.h>
0017
0018 #include "kasan.h"
0019
0020 void kasan_set_free_info(struct kmem_cache *cache,
0021 void *object, u8 tag)
0022 {
0023 struct kasan_alloc_meta *alloc_meta;
0024 u8 idx = 0;
0025
0026 alloc_meta = kasan_get_alloc_meta(cache, object);
0027 if (!alloc_meta)
0028 return;
0029
0030 #ifdef CONFIG_KASAN_TAGS_IDENTIFY
0031 idx = alloc_meta->free_track_idx;
0032 alloc_meta->free_pointer_tag[idx] = tag;
0033 alloc_meta->free_track_idx = (idx + 1) % KASAN_NR_FREE_STACKS;
0034 #endif
0035
0036 kasan_set_track(&alloc_meta->free_track[idx], GFP_NOWAIT);
0037 }
0038
0039 struct kasan_track *kasan_get_free_track(struct kmem_cache *cache,
0040 void *object, u8 tag)
0041 {
0042 struct kasan_alloc_meta *alloc_meta;
0043 int i = 0;
0044
0045 alloc_meta = kasan_get_alloc_meta(cache, object);
0046 if (!alloc_meta)
0047 return NULL;
0048
0049 #ifdef CONFIG_KASAN_TAGS_IDENTIFY
0050 for (i = 0; i < KASAN_NR_FREE_STACKS; i++) {
0051 if (alloc_meta->free_pointer_tag[i] == tag)
0052 break;
0053 }
0054 if (i == KASAN_NR_FREE_STACKS)
0055 i = alloc_meta->free_track_idx;
0056 #endif
0057
0058 return &alloc_meta->free_track[i];
0059 }