Skip to content

Commit 2e4be0d

Browse files
Vernon Lovejoyjpoimboe
authored andcommitted
x86/show_trace_log_lvl: Ensure stack pointer is aligned, again
The commit e335bb5 ("x86/unwind: Ensure stack pointer is aligned") tried to align the stack pointer in show_trace_log_lvl(), otherwise the "stack < stack_info.end" check can't guarantee that the last read does not go past the end of the stack. However, we have the same problem with the initial value of the stack pointer, it can also be unaligned. So without this patch this trivial kernel module #include <linux/module.h> static int init(void) { asm volatile("sub $0x4,%rsp"); dump_stack(); asm volatile("add $0x4,%rsp"); return -EAGAIN; } module_init(init); MODULE_LICENSE("GPL"); crashes the kernel. Fixes: e335bb5 ("x86/unwind: Ensure stack pointer is aligned") Signed-off-by: Vernon Lovejoy <[email protected]> Signed-off-by: Oleg Nesterov <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Josh Poimboeuf <[email protected]>
1 parent f7ba52f commit 2e4be0d

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

arch/x86/kernel/dumpstack.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
195195
printk("%sCall Trace:\n", log_lvl);
196196

197197
unwind_start(&state, task, regs, stack);
198-
stack = stack ? : get_stack_pointer(task, regs);
199198
regs = unwind_get_entry_regs(&state, &partial);
200199

201200
/*
@@ -214,9 +213,13 @@ static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
214213
* - hardirq stack
215214
* - entry stack
216215
*/
217-
for ( ; stack; stack = PTR_ALIGN(stack_info.next_sp, sizeof(long))) {
216+
for (stack = stack ?: get_stack_pointer(task, regs);
217+
stack;
218+
stack = stack_info.next_sp) {
218219
const char *stack_name;
219220

221+
stack = PTR_ALIGN(stack, sizeof(long));
222+
220223
if (get_stack_info(stack, task, &stack_info, &visit_mask)) {
221224
/*
222225
* We weren't on a valid stack. It's possible that

0 commit comments

Comments
 (0)