Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp2980912ybk; Mon, 18 May 2020 12:43:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzj0Yu2twLYaTbKf/rH6ugfnV8o3nVS4HgAW54GQkYzDxXae6+NZdV61031vnimMYn9Z6tq X-Received: by 2002:a17:906:3509:: with SMTP id r9mr16402611eja.382.1589831004749; Mon, 18 May 2020 12:43:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589831004; cv=none; d=google.com; s=arc-20160816; b=YoFwZLGWj6NslnhsFXM97PPlj5+t3cEASCNAxj6+6jXmsSyGQtvaHr8GSUpsaPnnnF RmVquzumGN/RLp+XItT5WJFzG5l0t9/mwqWhqYUlNqtG0LhvFKsqS57jokcudUJjJ/af 3q8Zu+ps9Gw6GZdQageU/sCT4ZMITUolj4aJ634SS72nvMacuDmG92I8E5vIvZPcjEe1 y/AhHihNNc4mrykUBxTvx4HUrFmMIo8icB2B7cOuBMD5ZFp/sPOI6DDTgylYs4VL8lLe Y+Bh7OaerMRkG6ulZBV0nSmGXhztT5nlUVlVFlEfqUT0aPUxsZMQrXm74weCHeKNMZA3 Dobg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=dlyyasKGIM+q7BSJL2Lfbtgg7uD/SKJNxOHxrXZ9YKs=; b=p7nxEE4zsAN4+OCTME99vlwGNXhbIszsVvH7PgbTjOUy20u3OhI6QZBSyffzD1pnrl paWzsj2Tb/vkMFLKKg7+7X4YenIBaMDIEATrpUUjkuiAcgHxsu21e92BcN2gKjYhGnH5 5hp7BuUNQxHjuDDXk7c+r4IgFaGE0+MMuwEfTn7zZ7gyZCP5jHKv20QeHuJnkPM8S84u 9Fs7RoHlz5LtoSP90XpcJMElvmXL/7sNjZ7Q5s+ULPa86M0CfTerfTcPa1IGzYvyYl7K LEcR1sENMbsJGNxdVqPRAadKW66wEeXaehX5aMMW+HhzJWqPHQIeFJ12xyNoY/mFckj0 dc8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=rtTeBza3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c14si494529edv.4.2020.05.18.12.43.00; Mon, 18 May 2020 12:43:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=rtTeBza3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733174AbgERSGc (ORCPT + 99 others); Mon, 18 May 2020 14:06:32 -0400 Received: from mail.kernel.org ([198.145.29.99]:54306 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733111AbgERSGS (ORCPT ); Mon, 18 May 2020 14:06:18 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2CB4F20715; Mon, 18 May 2020 18:06:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1589825177; bh=UhPmA86skCTZ0I4hcyBv0aJ4L7RzqQ9W+BIRB10S1Bs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rtTeBza3nHRbvgCPGMa9Ui1hol3LDG4Y4dSPvEFs/6kmdVWY/iHsBco8bReFucHGp o3O9fmT8ks+3mJAY72yWDlDyZfW7bHKIC3RWOIH8qu7V26+rMG+eUe0Em3rAAFk465 sERL/KdOxoop1oUG0cE3UUwPQNIrbH7c9qXyLpWE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Pavel Machek , Josh Poimboeuf , "Peter Zijlstra (Intel)" Subject: [PATCH 5.6 159/194] x86/unwind/orc: Fix error handling in __unwind_start() Date: Mon, 18 May 2020 19:37:29 +0200 Message-Id: <20200518173544.427788088@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518173531.455604187@linuxfoundation.org> References: <20200518173531.455604187@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Josh Poimboeuf commit 71c95825289f585014fe9741b051d32a7a916680 upstream. The unwind_state 'error' field is used to inform the reliable unwinding code that the stack trace can't be trusted. Set this field for all errors in __unwind_start(). Also, move the zeroing out of the unwind_state struct to before the ORC table initialization check, to prevent the caller from reading uninitialized data if the ORC table is corrupted. Fixes: af085d9084b4 ("stacktrace/x86: add function for detecting reliable stack traces") Fixes: d3a09104018c ("x86/unwinder/orc: Dont bail on stack overflow") Fixes: 98d0c8ebf77e ("x86/unwind/orc: Prevent unwinding before ORC initialization") Reported-by: Pavel Machek Signed-off-by: Josh Poimboeuf Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/d6ac7215a84ca92b895fdd2e1aa546729417e6e6.1589487277.git.jpoimboe@redhat.com Signed-off-by: Greg Kroah-Hartman --- arch/x86/kernel/unwind_orc.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) --- a/arch/x86/kernel/unwind_orc.c +++ b/arch/x86/kernel/unwind_orc.c @@ -611,23 +611,23 @@ EXPORT_SYMBOL_GPL(unwind_next_frame); void __unwind_start(struct unwind_state *state, struct task_struct *task, struct pt_regs *regs, unsigned long *first_frame) { - if (!orc_init) - goto done; - memset(state, 0, sizeof(*state)); state->task = task; + if (!orc_init) + goto err; + /* * Refuse to unwind the stack of a task while it's executing on another * CPU. This check is racy, but that's ok: the unwinder has other * checks to prevent it from going off the rails. */ if (task_on_another_cpu(task)) - goto done; + goto err; if (regs) { if (user_mode(regs)) - goto done; + goto the_end; state->ip = regs->ip; state->sp = regs->sp; @@ -660,6 +660,7 @@ void __unwind_start(struct unwind_state * generate some kind of backtrace if this happens. */ void *next_page = (void *)PAGE_ALIGN((unsigned long)state->sp); + state->error = true; if (get_stack_info(next_page, state->task, &state->stack_info, &state->stack_mask)) return; @@ -685,8 +686,9 @@ void __unwind_start(struct unwind_state return; -done: +err: + state->error = true; +the_end: state->stack_info.type = STACK_TYPE_UNKNOWN; - return; } EXPORT_SYMBOL_GPL(__unwind_start);