From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f45.google.com (mail-dl1-f45.google.com [74.125.82.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9AE23815DC for ; Thu, 16 Apr 2026 09:08:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.45 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776330509; cv=none; b=YjxTJUTmPrsPUDJvXk/OxBYiG3Fw1xOIowxcvXJMtrIusPqGbd506QSNE+RDq3EEZEUR3S7SkP6iHk4Oq8Ayc2lPn2vYch6kl0VQ3iNRCXpStZr6GZkcdR868v3/zI/oP5/2WJQBZii9Sd9TWv0pgWao7/t46HEP7aQioe13nNE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776330509; c=relaxed/simple; bh=yHskqd2Ai3Lbh145M3VvhDPFWxxoTMFnZIs4xmZHBBc=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=LpT3QHb25db44G5adiWJpKqP2E7zLCuVdJS8HFv8CxFwPhtoJU1IgSeU0mg7eyEZMtNYJl543R7Bi03TEwSgmZFciQK3iLY6nLUuJM7/SmLjc0Hmn1MM+ND+njpexye6+dS3d0dNk+ldAWhzHGjM4zTkIGZ9Dp1u0qESDZJ86JI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=RUPp8alN; arc=none smtp.client-ip=74.125.82.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RUPp8alN" Received: by mail-dl1-f45.google.com with SMTP id a92af1059eb24-12c555f886dso305900c88.0 for ; Thu, 16 Apr 2026 02:08:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776330507; x=1776935307; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=IHuDfpuVmFl5QLVcH12tE5gb+wugwJKCStG8y559P1s=; b=RUPp8alNJ1CvVt0Bj6j7uP5F1VsRv9fnBH2zkrk2jFBT3i4IclzkOOievlyLTqBEHZ lU8txR8WRdvzBqhDRxKAbxwLTAyyjOigX7CKSTS+vln7OmV0pcR83NR+gQsSyfegkn87 V7hft6vp8p4lvZpdjybG/+LAJykJio9qoecbs+2zEaT4YtYemMyuHADOV9WBWj3jEv0t 4AdlsJiw3SXS0/N8xOQ28nCfCDrJU11xufSaSJ3vQW2N4ttluU0St06ur1cJ3Jq9vZo4 lA4dw0j+vQNwunhrwNkQplNT9dcQ16yLpYeE4/Zj8UZtdlL4/HOaN5AR16FMMc562Xv6 ungw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776330507; x=1776935307; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=IHuDfpuVmFl5QLVcH12tE5gb+wugwJKCStG8y559P1s=; b=Bgi9zsTuUKoX/qCR1exJoIFY/jqsT1QZFmsv5nmfyjBjUJxSycR/lnpYE0LeJSYmL0 Pz0q57tJCOxdwJ8QB217JovxNb1c3o2PjXgXkM/LRwYCG6UnHe7y/QE858N947hvcnaa mmFDSylL93gty8gLehfkvDl/uZ9sP9RZEJYYgiZ/n4DxFV105StuJGa41AUCD1/alken pTR/XFZgQK17cdGapWrSDsPv+B/tGGQHwh65ZHupqoGPw4IqTGf4H8L5S3Uf+w/wQWjC 7Pq1jf4zCL8MwSpmVC3h93h5HcFTDCOFM/qFFNzEeR9UycXujJMpexsyq3KgpvPTgtuG CWyA== X-Forwarded-Encrypted: i=1; AFNElJ8NTOF3CJOVWAKTufQ199S8bX+KIUKY8my2wuSKfyAPbNjqhbN4oZm3e4gbNpPhE8P8eCI5+XqDCJIbAKc=@vger.kernel.org X-Gm-Message-State: AOJu0YyWxmDnr8jnfB+npiADg08cHDim1Qf9ZUO6j76M8K0WF6apG4wV KYpybymrosRjIj6gkdIq//XoDV8xKuwiXKBHArc9cYFcZX3PZa4b72AR X-Gm-Gg: AeBDievsA2AHTRQW7pADGDXzvDP1PyQjbIdof33bHoBMTc0VCYrNWj9BReW+vWurbQX 0ngWIc874eM5/4vTmFB+ZsK70AHkoyyiwgY6V4n8JzdHeL0snd3cOYF8V3oxyiac63HgF8YC9Mt /5PueTfEDOHscqfl6FFVcclCCn73fE0p2h6OdOLfoX94pgSnl+qjtcmpK1gt/URaSHfHOH893kv CTwZVQsQ83Xvgb7nUvzh8mzgRJ+JQi0iirKmmP3xjj9QdcxYCVa2c/RBRIE9fwgd0iGtJ2Hm28f GvDICCs8jMSdOUFpNKPd6tHP/RnbasSPUolbE54zBGyHrT15XG2Ihzoi3HwPo90VmkRs+KfH1Y8 /YMxnuiQRLb49HF29ihvpUnwy4OeoquyzXg3MULcn5/gtLHMOFju/aJwardum8RdAOwTu5LXILa U5bUBLZkmY5aX07nvGEfueZItHfNGXfPkjqthrRARtHGaQfche9poVqPK2Zpf2uGwIppmT6NWo7 EY+fMtgrlAYfadDdLGFQXHyr8TI6sYiQK2NUM+/gM7d5BD5w3Zb7hWgYYhSJEx9Gt3pJMdOk9BZ AzUnXL9eLv7T39t0dWy9YxM= X-Received: by 2002:a05:7022:f9d:b0:119:e56b:c75c with SMTP id a92af1059eb24-12c34f069edmr14207733c88.33.1776330506815; Thu, 16 Apr 2026 02:08:26 -0700 (PDT) Received: from 2045L.localdomain (49.sub-75-226-46.myvzw.com. [75.226.46.49]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c5e6a8496sm5185955c88.10.2026.04.16.02.08.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Apr 2026 02:08:26 -0700 (PDT) From: Gui-Dong Han To: Guenter Roeck Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, baijiaju1990@gmail.com, Gui-Dong Han Subject: [PATCH 1/2] hwmon: (lm63) Convert macro to function to avoid TOCTOU Date: Thu, 16 Apr 2026 17:07:51 +0800 Message-ID: <20260416090752.97392-1-hanguidong02@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The macro FAN_FROM_REG evaluates its argument multiple times. When used in lockless code accessing shared driver data, this can cause a Time-of-Check to Time-of-Use (TOCTOU) race and potentially a divide-by-zero error. Convert the macro to a static function so that the register value is evaluated only once. Check the other conversion macros in the driver as well. Keep them unchanged because they either do not evaluate arguments multiple times or are only used from locked code paths. Link: https://lore.kernel.org/linux-hwmon/CALbr=LYJ_ehtp53HXEVkSpYoub+XYSTU8Rg=o1xxMJ8=5z8B-g@mail.gmail.com/ Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Gui-Dong Han --- While learning the hwmon driver code, I found a few more potential TOCTOU problems in drivers still using the older non-_with_info() APIs. Fix them. --- drivers/hwmon/lm63.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c index 035176a98ce9..da132b267c58 100644 --- a/drivers/hwmon/lm63.c +++ b/drivers/hwmon/lm63.c @@ -109,8 +109,14 @@ static const unsigned short normal_i2c[] = { 0x18, 0x4c, 0x4e, I2C_CLIENT_END }; * adapted accordingly. */ -#define FAN_FROM_REG(reg) ((reg) == 0xFFFC || (reg) == 0 ? 0 : \ - 5400000 / (reg)) +static int fan_from_reg(int reg) +{ + if (reg == 0xFFFC || reg == 0) + return 0; + + return 5400000 / reg; +} + #define FAN_TO_REG(val) ((val) <= 82 ? 0xFFFC : \ (5400000 / (val)) & 0xFFFC) #define TEMP8_FROM_REG(reg) ((reg) * 1000) @@ -333,7 +339,7 @@ static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, { struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct lm63_data *data = lm63_update_device(dev); - return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[attr->index])); + return sprintf(buf, "%d\n", fan_from_reg(data->fan[attr->index])); } static ssize_t set_fan(struct device *dev, struct device_attribute *dummy, -- 2.43.0