Commit 305e519c authored by Alexander Potapenko's avatar Alexander Potapenko Committed by Linus Torvalds

lib/stackdepot.c: fix global out-of-bounds in stack_slabs

Walter Wu has reported a potential case in which init_stack_slab() is
called after stack_slabs[STACK_ALLOC_MAX_SLABS - 1] has already been
initialized.  In that case init_stack_slab() will overwrite
stack_slabs[STACK_ALLOC_MAX_SLABS], which may result in a memory
corruption.

Link: http://lkml.kernel.org/r/20200218102950.260263-1-glider@google.com
Fixes: cd11016e ("mm, kasan: stackdepot implementation. Enable stackdepot for SLAB")
Signed-off-by: default avatarAlexander Potapenko <glider@google.com>
Reported-by: default avatarWalter Wu <walter-zh.wu@mediatek.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kate Stewart <kstewart@linuxfoundation.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 18e19f19
...@@ -83,15 +83,19 @@ static bool init_stack_slab(void **prealloc) ...@@ -83,15 +83,19 @@ static bool init_stack_slab(void **prealloc)
return true; return true;
if (stack_slabs[depot_index] == NULL) { if (stack_slabs[depot_index] == NULL) {
stack_slabs[depot_index] = *prealloc; stack_slabs[depot_index] = *prealloc;
*prealloc = NULL;
} else { } else {
/* If this is the last depot slab, do not touch the next one. */
if (depot_index + 1 < STACK_ALLOC_MAX_SLABS) {
stack_slabs[depot_index + 1] = *prealloc; stack_slabs[depot_index + 1] = *prealloc;
*prealloc = NULL;
}
/* /*
* This smp_store_release pairs with smp_load_acquire() from * This smp_store_release pairs with smp_load_acquire() from
* |next_slab_inited| above and in stack_depot_save(). * |next_slab_inited| above and in stack_depot_save().
*/ */
smp_store_release(&next_slab_inited, 1); smp_store_release(&next_slab_inited, 1);
} }
*prealloc = NULL;
return true; return true;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment