Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp3201819pxb; Mon, 9 Nov 2020 05:29:13 -0800 (PST) X-Google-Smtp-Source: ABdhPJyRv2xqwOHZHvcJOw9p6m/38mUvM9C3oUoWKiCSQBA6gFOUw+EXnkBysH/Bc22U02oRPVq7 X-Received: by 2002:a17:906:50e:: with SMTP id j14mr7072754eja.403.1604928553745; Mon, 09 Nov 2020 05:29:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604928553; cv=none; d=google.com; s=arc-20160816; b=wnd6e+hNctG+WoHhDSf56587DX8cxlesK5fGdlatOYCwhBPwNB7wMzhHdT4Tl/jKz6 3e4hlRq1CbEIyAMsvYEocCFTGEVPqHyebwDM5GX7xnvCK22B68SWmEblOot7PafGwmq3 PFircEBIYXSl2Pe5upS5Izpvv3+WzIDEptKGcjChjMkl8Cbo2WP47EhY+lwiuRqTUpyC 7tMvUcpLfo91g6wXy01qkMlGjgYogqAc555wLnKD68OiK7nx6eE1gkT2fv1RkxpA9/UV 4i5PpQQzUOO8q1ijngxzoXLDiJC86g4dIj8Z1w8JCI/MzOWhA35cG9THQFcIsxQkAQTa mC8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=0Gm54Bj7VZBXcNNR1hAVpAOc1bUwctFEMVhE7wM13EA=; b=E7pnamDH952zxM59uR+nWKFEcBAb5MIGQ9Lj4bH+ykCnzWK6fdDvF7G/DDkNI6c1Ls 9fYWCWfyy7zCoyjQN0jxEjA+hn+bWeAc41Lu808or+t9HcfguoHh+sRZN5xJaUiQXgvj TWMZiPZG35Upl9lXRupkCOzToUX0XZh2bDv/gBxspna1JIwLGN0SIr8CTopB4Hqz23LY UWq+KAVkA1gT1GIJxfnr8XQz+f8E5li64noNcRTBVvEELkmYhpPhnRkEpzQknfrH2R3p pqqtjEdsC30iys5Tf2/p2zqlw5nC+w1djxwF6Ccu5jSBgGMGBU8I8vYF1WBFRyrAv632 /bOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=oyPE5Fqb; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a10si7355426edq.316.2020.11.09.05.28.51; Mon, 09 Nov 2020 05:29:13 -0800 (PST) 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=oyPE5Fqb; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387431AbgKIN1Q (ORCPT + 99 others); Mon, 9 Nov 2020 08:27:16 -0500 Received: from mail.kernel.org ([198.145.29.99]:41704 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733270AbgKINPE (ORCPT ); Mon, 9 Nov 2020 08:15:04 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (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 8FFCA216C4; Mon, 9 Nov 2020 13:15:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1604927703; bh=M0G466X9KyROxK/ZmhJEsQmpTXTT0u9NemVAF6Vjwbo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oyPE5Fqbyjpfdgt5XkTJ5rvQ4uadmIT74QKn+s5GNMnVpv66zazg2aImPNbthf0NN I3S7X8nebHnBaRNpnguNmcMP0o70WViIsIb2ffq/ydIR1vCjQTCclaGWRbIowFRki3 IH3SA+KQssMWnKDmk94eML3uaCEc013Kpv6c1IHk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vineet Gupta Subject: [PATCH 5.4 79/85] ARC: stack unwinding: avoid indefinite looping Date: Mon, 9 Nov 2020 13:56:16 +0100 Message-Id: <20201109125026.372872473@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201109125022.614792961@linuxfoundation.org> References: <20201109125022.614792961@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vineet Gupta commit 328d2168ca524d501fc4b133d6be076142bd305c upstream. Currently stack unwinder is a while(1) loop which relies on the dwarf unwinder to signal termination, which in turn relies on dwarf info to do so. This in theory could cause an infinite loop if the dwarf info was somehow messed up or the register contents were etc. This fix thus detects the excessive looping and breaks the loop. | Mem: 26184K used, 1009136K free, 0K shrd, 0K buff, 14416K cached | CPU: 0.0% usr 72.8% sys 0.0% nic 27.1% idle 0.0% io 0.0% irq 0.0% sirq | Load average: 4.33 2.60 1.11 2/74 139 | PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND | 133 2 root SWN 0 0.0 3 22.9 [rcu_torture_rea] | 132 2 root SWN 0 0.0 0 22.0 [rcu_torture_rea] | 131 2 root SWN 0 0.0 3 21.5 [rcu_torture_rea] | 126 2 root RW 0 0.0 2 5.4 [rcu_torture_wri] | 129 2 root SWN 0 0.0 0 0.2 [rcu_torture_fak] | 137 2 root SW 0 0.0 0 0.2 [rcu_torture_cbf] | 127 2 root SWN 0 0.0 0 0.1 [rcu_torture_fak] | 138 115 root R 1464 0.1 2 0.1 top | 130 2 root SWN 0 0.0 0 0.1 [rcu_torture_fak] | 128 2 root SWN 0 0.0 0 0.1 [rcu_torture_fak] | 115 1 root S 1472 0.1 1 0.0 -/bin/sh | 104 1 root S 1464 0.1 0 0.0 inetd | 1 0 root S 1456 0.1 2 0.0 init | 78 1 root S 1456 0.1 0 0.0 syslogd -O /var/log/messages | 134 2 root SW 0 0.0 2 0.0 [rcu_torture_sta] | 10 2 root IW 0 0.0 1 0.0 [rcu_preempt] | 88 2 root IW 0 0.0 1 0.0 [kworker/1:1-eve] | 66 2 root IW 0 0.0 2 0.0 [kworker/2:2-eve] | 39 2 root IW 0 0.0 2 0.0 [kworker/2:1-eve] | unwinder looping too long, aborting ! Cc: Signed-off-by: Vineet Gupta Signed-off-by: Greg Kroah-Hartman --- arch/arc/kernel/stacktrace.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) --- a/arch/arc/kernel/stacktrace.c +++ b/arch/arc/kernel/stacktrace.c @@ -112,7 +112,7 @@ arc_unwind_core(struct task_struct *tsk, int (*consumer_fn) (unsigned int, void *), void *arg) { #ifdef CONFIG_ARC_DW2_UNWIND - int ret = 0; + int ret = 0, cnt = 0; unsigned int address; struct unwind_frame_info frame_info; @@ -132,6 +132,11 @@ arc_unwind_core(struct task_struct *tsk, break; frame_info.regs.r63 = frame_info.regs.r31; + + if (cnt++ > 128) { + printk("unwinder looping too long, aborting !\n"); + return 0; + } } return address; /* return the last address it saw */