diff options
author | Andrey Ryabinin <aryabinin@virtuozzo.com> | 2016-08-02 17:02:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-08-02 17:31:41 -0400 |
commit | b3cbd9bf77cd1888114dbee1653e79aa23fd4068 (patch) | |
tree | f9a10e2c14b336f276805f8a4714d0bd437d1646 /mm/kasan/quarantine.c | |
parent | 47b5c2a0f021e90a79845d1a1353780e5edd0bce (diff) |
mm/kasan: get rid of ->state in struct kasan_alloc_meta
The state of object currently tracked in two places - shadow memory, and
the ->state field in struct kasan_alloc_meta. We can get rid of the
latter. The will save us a little bit of memory. Also, this allow us
to move free stack into struct kasan_alloc_meta, without increasing
memory consumption. So now we should always know when the last time the
object was freed. This may be useful for long delayed use-after-free
bugs.
As a side effect this fixes following UBSAN warning:
UBSAN: Undefined behaviour in mm/kasan/quarantine.c:102:13
member access within misaligned address ffff88000d1efebc for type 'struct qlist_node'
which requires 8 byte alignment
Link: http://lkml.kernel.org/r/1470062715-14077-5-git-send-email-aryabinin@virtuozzo.com
Reported-by: kernel test robot <xiaolong.ye@intel.com>
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/kasan/quarantine.c')
-rw-r--r-- | mm/kasan/quarantine.c | 2 |
1 files changed, 0 insertions, 2 deletions
diff --git a/mm/kasan/quarantine.c b/mm/kasan/quarantine.c index 4852625ff851..7fd121d13b88 100644 --- a/mm/kasan/quarantine.c +++ b/mm/kasan/quarantine.c | |||
@@ -144,13 +144,11 @@ static void *qlink_to_object(struct qlist_node *qlink, struct kmem_cache *cache) | |||
144 | static void qlink_free(struct qlist_node *qlink, struct kmem_cache *cache) | 144 | static void qlink_free(struct qlist_node *qlink, struct kmem_cache *cache) |
145 | { | 145 | { |
146 | void *object = qlink_to_object(qlink, cache); | 146 | void *object = qlink_to_object(qlink, cache); |
147 | struct kasan_alloc_meta *alloc_info = get_alloc_info(cache, object); | ||
148 | unsigned long flags; | 147 | unsigned long flags; |
149 | 148 | ||
150 | if (IS_ENABLED(CONFIG_SLAB)) | 149 | if (IS_ENABLED(CONFIG_SLAB)) |
151 | local_irq_save(flags); | 150 | local_irq_save(flags); |
152 | 151 | ||
153 | alloc_info->state = KASAN_STATE_FREE; | ||
154 | ___cache_free(cache, object, _THIS_IP_); | 152 | ___cache_free(cache, object, _THIS_IP_); |
155 | 153 | ||
156 | if (IS_ENABLED(CONFIG_SLAB)) | 154 | if (IS_ENABLED(CONFIG_SLAB)) |