Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp3199713pxb; Mon, 9 Nov 2020 05:26:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJyZfayr3qYXzdUYHI6uil3EfQJ6TdSMhS8v7PZBNZw1FYmSkcblg711quHl/7vi179dQXAS X-Received: by 2002:a17:906:af47:: with SMTP id ly7mr15762258ejb.532.1604928367511; Mon, 09 Nov 2020 05:26:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604928367; cv=none; d=google.com; s=arc-20160816; b=Ibss87zS2v75EtbGHpmV5H5yH6YyFQYtZjLFmB/oo4qBDY4RSyaLJ8cImwSGc+PF6/ 4/RpjJGaRaSBJlN7H9uFqoTOpS6bGFfbSY0laNlRha9W3MqfmeV5LaMnEEAcPIz+l8Wu LMvxOb1n4kbdm7Rvgq8dnSC3tTHnq9ruXdR090dIBUeAULBKaams20vWzycMJhEvtYfH MPbt/+csjer7pZ697d6KfopKdx0OvGd+RqtOEr1jHBp8fcymEHWpOc/Hw7NMgsmRG3t2 LnNqYB/qboF8EBWfDftSB8j/MgTp40wHCW0PQNBhJuGGrplnj3u2+kygNshQ0v6XoroE 4G9g== 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=YMlK3sp0BT9f883s0HtD8qqkbm2XdRu45xhsQCjKxNjaJSYUoL939yIE3f1tnboN31 qBtAgnCpQIFuk1cMYt1UFwWihIaRBuffVp9Nl7F4efGaDB1k0STl0eNid28NiU5qbsxX rkJ0DjHKz8q60ycOpz2uYgby/Eisg/ClC4k5JH0fA47TD5XA8GqvJxe6un99TWFPMpUA 8ojG8pApQty3i8BADMpo96xEmpffYSbToWXALUS88104qfUJtJ+Ze2GKq56+Fe6fOeWb 0OJUHoULdnT2rfmMR4doENM1adLPpFayxgErOF71gG35kjVPCHV03ZBRXqInSwolJ6jL Ec6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=IpfbyfVr; 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 v16si7023455ejf.28.2020.11.09.05.25.42; Mon, 09 Nov 2020 05:26:07 -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=IpfbyfVr; 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 S2388195AbgKINW0 (ORCPT + 99 others); Mon, 9 Nov 2020 08:22:26 -0500 Received: from mail.kernel.org ([198.145.29.99]:50362 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388174AbgKINWX (ORCPT ); Mon, 9 Nov 2020 08:22:23 -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 05E682083B; Mon, 9 Nov 2020 13:22:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1604928141; bh=M0G466X9KyROxK/ZmhJEsQmpTXTT0u9NemVAF6Vjwbo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IpfbyfVrTEZK9IzG8YckLPp/jZwdgDW3kIvoRgko8FORotRfvhAE4bTnpXrkz7R7R MAL/FK8I8XdnZvUzXdIk3IFw2X/FXRqG0qW7G4UfKV5RkwmwIw/2cz9DrFj1xqPD/0 A9gNNhi3WgrUg9ZFdmk3GkE38VUL+yYKMc5Vaa+o= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vineet Gupta Subject: [PATCH 5.9 127/133] ARC: stack unwinding: avoid indefinite looping Date: Mon, 9 Nov 2020 13:56:29 +0100 Message-Id: <20201109125036.795970201@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201109125030.706496283@linuxfoundation.org> References: <20201109125030.706496283@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 */