Skip to content

x86: fix free_thread_info() with uninitalized thread_info

Akinobu Mita lkml 1 version New

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest4 patches 0 repliesNew

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/4convert task_struct allocator macros to inline functionskernel/fork.c+12 -20 replies
2/4x86: arch specific task_struct allocatorarch/x86/include/asm/thread_info.h arch/x86/kernel/process.c+22 -00 replies
3/4x86: call free_thread_xstate() in free_task_struct()arch/x86/kernel/process.c+1 -10 replies
4/4x86: use generic thread_info allocatorarch/x86/include/asm/page_32.h arch/x86/include/asm/page_64.h arch/x86/include/asm/thread_info.h +1 more+5 -230 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [PATCH 0/4] x86: fix free_thread_info() with uninitalized thread_info

This patch series fixes a problem described below. The actual fix is only made by the patch 3/4. The rest of patches help it make simple and there is no actual behavioral change.

x86 arch specific free_thread_info() accesses thread_info->task to call free_thread_xstate(). But the thread_info may not be initialized yet. So invalid pointer derefence may happen in free_thread_xstate().

It happens in the following scenario in dup_task_struct()

1. call alloc_task_struct() to allocate empty task_struct
2. call alloc_thread_info() to allocate empty thread_info
3. call arch_dup_task_struct()

x86 arch specific arch_dup_task_struct() copies task_struct from source task_struct. it also allocates empty xstate and copy from source if source task_struct has ->thread.xstate.

If the xstate allocation failed, arch_dup_task_struct() returns error.

4. call free_thread_info() to deallocate thread_info

x86 arch specific free_thread_info() calls free_thread_xstate() with thread_info->task. But the thread_info is not initialized yet.