Messages in this thread | | | Date | Thu, 23 Nov 2017 12:19:21 +0100 | From | Borislav Petkov <> | Subject | Re: [PATCH v2 08/18] x86/dumpstack: Handle stack overflow on all stacks |
| |
On Tue, Nov 21, 2017 at 08:44:03PM -0800, Andy Lutomirski wrote: > We currently special-case stack overflow on the task stack. We're > going to start putting special stacks in the fixmap with a custom > layout, so they'll have guard pages, too. Teach the unwinder to be > able to unwind an overflow of any of the stacks. > > Signed-off-by: Andy Lutomirski <luto@kernel.org> > --- > arch/x86/kernel/dumpstack.c | 26 ++++++++++++++++---------- > 1 file changed, 16 insertions(+), 10 deletions(-) > > diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c > index 5e7d10e8ca25..635dcbfe2398 100644 > --- a/arch/x86/kernel/dumpstack.c > +++ b/arch/x86/kernel/dumpstack.c > @@ -90,24 +90,30 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, > * - task stack > * - interrupt stack > * - HW exception stacks (double fault, nmi, debug, mce) > + * - SYSENTER stack > * > - * x86-32 can have up to three stacks: > + * x86-32 can have up to four stacks: > * - task stack > * - softirq stack > * - hardirq stack > + * - SYSENTER stack > */ > for (regs = NULL; stack; stack = PTR_ALIGN(stack_info.next_sp, sizeof(long))) { > const char *stack_name; > > - /* > - * If we overflowed the task stack into a guard page, jump back > - * to the bottom of the usable stack. > - */ > - if (task_stack_page(task) - (void *)stack < PAGE_SIZE) > - stack = task_stack_page(task); > - > - if (get_stack_info(stack, task, &stack_info, &visit_mask)) > - break; > + if (get_stack_info(stack, task, &stack_info, &visit_mask)) { > + /* > + * We weren't on a valid stack. It's possible that > + * we overflowed a valid stack into a guard page. > + * See if the next page up is valid to that we can
s/to/so/
> + * generate some kind of backtrace if this happens. > + */ > + stack = (unsigned long *) > + PAGE_ALIGN((unsigned long)stack); > + if (get_stack_info(stack, task, &stack_info, > + &visit_mask))
Yeah, let them stick out.
With that:
Reviewed-by: Borislav Petkov <bp@suse.de>
-- Regards/Gruss, Boris.
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg) --
| |