Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2250561imm; Mon, 28 May 2018 04:47:18 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpLo0WyiyG1+9NQj1bd578yITaLLXmGBbqJJJH+BCC8BQHlFIRLo3QRCS1bfUyDaF8bXjrh X-Received: by 2002:a65:48c9:: with SMTP id o9-v6mr10541421pgs.106.1527508038804; Mon, 28 May 2018 04:47:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527508038; cv=none; d=google.com; s=arc-20160816; b=AfvXxgs3z65cqe92ZhuVfR7RKwOlaO7sTnzWVBQdfZTCGsAyC0pv0Xeg2nkemMT/ps oStDqGbNSJVpVOE/v7NUGlcEIkAcmgJovpsTbM0cwfsGOnCh1yJ6p1QH1kUF9Tok7/k+ dNa6XMC3QWHI6sf+pzQ3N7SU8GyP/y8fTQmLbjxohmXSBWPBp0gKpBpKrDu6LJnt9/L2 vJXbbm6+oU/JIPiIH3jqAPKoO4jX/8OlrIrgmsv8vI4nLYONqzGfpW2294ZBv/SwpjpU UjfzgJL3cTACWZZK46G4VnMOa6vEr/omUK/d6XNq/TsVYgwMT3mQYkVJXLUT4rgLFms5 Pnaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=OMpt0Zpv6NLAQIAMaKjV3+o/jmmvgQqmmi77fIaG0cA=; b=AY0mWDLbCaUPTbETXsE1AF/DU7Rf5+e358Pi3zzvO7s8pPPmqYCQ3IB7v+d3aXrErY CdTGAUOkwESQII2Zm6FlW0jHkVXl4+Ue6ckAoHqLUPWG3dSH0ta8833u3ujkaIsYhYrr bSXzS5Nq6CxGB53qWUQ//AaHkHcQAtH4azUgopbrtdPpNWkGPBXzzsSbYAxiKzVLJfH2 gM/XbZmcruE/jsZtJg9KUO1+g23L+NAu+g2ksFibr8ZzrTvVao4cVZjraqss/AJyqAND K2Jp/5F9JPMGbE7vFi2CBII1jOkq5CWohKmEPeHVuJAAFFELNw0IFPf7xYRw9VktAcCs 0U6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ptcruR4Q; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v187-v6si6580479pgb.86.2018.05.28.04.47.04; Mon, 28 May 2018 04:47:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ptcruR4Q; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1424778AbeE1LqQ (ORCPT + 99 others); Mon, 28 May 2018 07:46:16 -0400 Received: from mail.kernel.org ([198.145.29.99]:58940 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1423260AbeE1LK4 (ORCPT ); Mon, 28 May 2018 07:10:56 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) (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 A94442088E; Mon, 28 May 2018 11:10:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527505855; bh=HkgNRTBuXgV/5hWi1b1KbPIyDEM0S78cUTE5GK6wM0Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ptcruR4QlGLuK2rqzETk3ojVOx4eH6rc5W7XDAYs94rFoO0tXE5xOhLhh5a5RbAW4 sqHCjdaI+8SJtDE2KTMQc/UIgMgQKVUdhnqGGoZ08f6toENqNTDijwEfbOVmycPoCB ThLsJExgqvRdi3hjsC7dZLzDkGEoa9SHtBtgL178= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Frank Asseg , Jiri Kosina , Sasha Levin Subject: [PATCH 4.16 117/272] tools/thermal: tmon: fix for segfault Date: Mon, 28 May 2018 12:02:30 +0200 Message-Id: <20180528100250.979378409@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180528100240.256525891@linuxfoundation.org> References: <20180528100240.256525891@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.16-stable review patch. If anyone has any objections, please let me know. ------------------ From: Frank Asseg [ Upstream commit 6c59f64b7ecf2bccbe73931d7d573d66ed13b537 ] Fixes a segfault occurring when e.g. is pressed multiple times in the ncurses tmon application. The segfault is caused by incrementing cur_thermal_record in the main function without checking if it's value reached NR_THERMAL_RECORD immediately. Since the boundary check only occurred in update_thermal_data a race condition existed, which lead to an attempted read beyond the last element of the trec array. The fix was implemented by moving the cur_thermal_record incrementation to the update_thermal_data function using a temporary variable on which the boundary condition is checked before updating cur_thread_record, so that the variable is never incremented beyond the trec array's boundary. It seems the segfault does not occur on every machine: On a HP EliteBook G4 the segfault happens, while it does not happen on a Thinkpad T540p. Signed-off-by: Frank Asseg Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- tools/thermal/tmon/sysfs.c | 12 +++++++----- tools/thermal/tmon/tmon.c | 1 - 2 files changed, 7 insertions(+), 6 deletions(-) --- a/tools/thermal/tmon/sysfs.c +++ b/tools/thermal/tmon/sysfs.c @@ -486,6 +486,7 @@ int zone_instance_to_index(int zone_inst int update_thermal_data() { int i; + int next_thermal_record = cur_thermal_record + 1; char tz_name[256]; static unsigned long samples; @@ -495,9 +496,9 @@ int update_thermal_data() } /* circular buffer for keeping historic data */ - if (cur_thermal_record >= NR_THERMAL_RECORDS) - cur_thermal_record = 0; - gettimeofday(&trec[cur_thermal_record].tv, NULL); + if (next_thermal_record >= NR_THERMAL_RECORDS) + next_thermal_record = 0; + gettimeofday(&trec[next_thermal_record].tv, NULL); if (tmon_log) { fprintf(tmon_log, "%lu ", ++samples); fprintf(tmon_log, "%3.1f ", p_param.t_target); @@ -507,11 +508,12 @@ int update_thermal_data() snprintf(tz_name, 256, "%s/%s%d", THERMAL_SYSFS, TZONE, ptdata.tzi[i].instance); sysfs_get_ulong(tz_name, "temp", - &trec[cur_thermal_record].temp[i]); + &trec[next_thermal_record].temp[i]); if (tmon_log) fprintf(tmon_log, "%lu ", - trec[cur_thermal_record].temp[i]/1000); + trec[next_thermal_record].temp[i] / 1000); } + cur_thermal_record = next_thermal_record; for (i = 0; i < ptdata.nr_cooling_dev; i++) { char cdev_name[256]; unsigned long val; --- a/tools/thermal/tmon/tmon.c +++ b/tools/thermal/tmon/tmon.c @@ -336,7 +336,6 @@ int main(int argc, char **argv) show_data_w(); show_cooling_device(); } - cur_thermal_record++; time_elapsed += ticktime; controller_handler(trec[0].temp[target_tz_index] / 1000, &yk);