From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751748AbdK3IDa (ORCPT ); Thu, 30 Nov 2017 03:03:30 -0500 Received: from mx2.suse.de ([195.135.220.15]:40707 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750890AbdK3ID2 (ORCPT ); Thu, 30 Nov 2017 03:03:28 -0500 From: Jiri Slaby To: mingo@redhat.com Cc: linux-kernel@vger.kernel.org, Jiri Slaby , Thomas Gleixner , "H. Peter Anvin" , x86@kernel.org, Josh Poimboeuf Subject: [PATCH 2/2] x86/stacktrace: make sure reliable stack trace reached userspace Date: Thu, 30 Nov 2017 09:03:25 +0100 Message-Id: <20171130080325.24785-2-jslaby@suse.cz> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20171130080325.24785-1-jslaby@suse.cz> References: <20171130080325.24785-1-jslaby@suse.cz> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Make sure that save_stack_trace_reliable reached userspace when saying "this stack trace is reliable." Place this check only after stack unwinding error check, so that the stack is printed if something really went wrong during unwinding. Signed-off-by: Jiri Slaby Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: x86@kernel.org Cc: Josh Poimboeuf --- arch/x86/kernel/stacktrace.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c index 221a03e251bb..2153aff1b459 100644 --- a/arch/x86/kernel/stacktrace.c +++ b/arch/x86/kernel/stacktrace.c @@ -98,6 +98,7 @@ __save_stack_trace_reliable(struct stack_trace *trace, struct unwind_state state; struct pt_regs *regs; unsigned long addr; + bool reached_user = false; for (unwind_start(&state, task, NULL, NULL); !unwind_done(&state); unwind_next_frame(&state)) { @@ -117,6 +118,7 @@ __save_stack_trace_reliable(struct stack_trace *trace, STACKTRACE_DUMP_ONCE(task); return -EINVAL; } + reached_user = true; break; } @@ -142,6 +144,9 @@ __save_stack_trace_reliable(struct stack_trace *trace, return -EINVAL; } + if (!reached_user) + return -EINVAL; + if (trace->nr_entries < trace->max_entries) trace->entries[trace->nr_entries++] = ULONG_MAX; -- 2.15.0