From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752680AbdKWLT3 (ORCPT ); Thu, 23 Nov 2017 06:19:29 -0500 Received: from mx2.suse.de ([195.135.220.15]:47762 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752218AbdKWLT2 (ORCPT ); Thu, 23 Nov 2017 06:19:28 -0500 Date: Thu, 23 Nov 2017 12:19:21 +0100 From: Borislav Petkov To: Andy Lutomirski Cc: X86 ML , "linux-kernel@vger.kernel.org" , Brian Gerst , Dave Hansen , Linus Torvalds , Josh Poimboeuf Subject: Re: [PATCH v2 08/18] x86/dumpstack: Handle stack overflow on all stacks Message-ID: <20171123111921.2hhyk2ldwraadhxn@pd.tnic> References: <2f7a8568777ab77417c30c11e7d0c787b0cf7c5b.1511325444.git.luto@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <2f7a8568777ab77417c30c11e7d0c787b0cf7c5b.1511325444.git.luto@kernel.org> User-Agent: NeoMutt/20170609 (1.8.3) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > --- > 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 -- Regards/Gruss, Boris. SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg) --