Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2497079imm; Mon, 28 May 2018 09:11:26 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrq7elPjU6KcM2l8M8kssg3MuLiKFLIrCfRe6RczMJu7ZLAY+zcMPT2Xt/1rpTBOMt776bo X-Received: by 2002:a17:902:9a98:: with SMTP id w24-v6mr14603560plp.9.1527523886622; Mon, 28 May 2018 09:11:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527523886; cv=none; d=google.com; s=arc-20160816; b=jcaG5a0HFZPPZ81+3ejqjHm8Ll7EflSkVc7LHRLjji2WXAjcWwtEHxIfB66rnRMO4w b4cZcZt+ZRLbZAug6A0NXn6eU9PvV1Xi63apTR/Ft81nfQV1nEe7kO+uu52vQ1cZ/lbE Gh+jduQx8rACc6uWEdchjIsnFqzLP5Pf1XF6F/YsKkxejWC9Oq4VU8EiDJFokLcX4D+H se6OOJ+/mWuUWs8NFRTvzbnu9k8sFLhxafrP72TESP6SvoW8YiAYEZpiGAkNNjre/2ZH uzPlnxNIa/V3jHCvnANhKpbcAG0+sixacSGrNtpjG8NUtkE49Gvkdo85oH78qSyFZ/QS J32g== 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=jiXaANCTKy6JLASTps/FFpStoVuYXHydP5QovUICAQg=; b=xFqJYZWEsIdVKCr/uYmehVRHSNE61FBQwFPOwzkwDX2L2s6o6G9wK+VdLHGGe733xZ aHyITTJj/mC4YeHJRdJYYyRmrrrQbfj0kIukoVBSIu3dwHOnRJH6/Hsv32qjTodhRuo1 Lli9Txq+PUlwni9FkgA7b+yyQTiZ5pybvmsb6iTmTVU1zBqoc0kOp/KDG8u7G8iAyOOF YjpzCTYaRpAU6ry0QL1EMs1qa7CWiB+8hPeHHL/tfzQF8bnmJag67DFHm7Cbp0Y3Kiwp NXygt0/rh3j7ERcIsF/AnyaBFs61pNxuTm0XeCm+W1Ik8pwhDndGp77kgMzZ2JMl5K4w bSMA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FVRQ8D9G; 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 g2-v6si32550551plm.181.2018.05.28.09.11.11; Mon, 28 May 2018 09:11:26 -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=FVRQ8D9G; 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 S936820AbeE1KNr (ORCPT + 99 others); Mon, 28 May 2018 06:13:47 -0400 Received: from mail.kernel.org ([198.145.29.99]:33432 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936793AbeE1KNf (ORCPT ); Mon, 28 May 2018 06:13:35 -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 E335820883; Mon, 28 May 2018 10:13:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527502415; bh=N43PPNTR6HMp1uKBnRi90LG+N6hTz26WQJWkb9zrTLk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FVRQ8D9GMxT74mrqJIMKlWtDOZCPwI9KDzh8Wgxvf3PKeiuF/qT0Y46PTQUKQaA3S s2/UjVDSX0C9cnR3/KujjWh8yAFuObCgpoID8BpigT61o43uBd535d9GeQ3liA+4R7 yfbyTcAAjXDqL3Hh0h0GM2sqBmKZspHTUtE86NT0= 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 3.18 135/185] tools/thermal: tmon: fix for segfault Date: Mon, 28 May 2018 12:02:56 +0200 Message-Id: <20180528100105.705974833@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180528100050.700971285@linuxfoundation.org> References: <20180528100050.700971285@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 3.18-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 @@ -326,7 +326,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);