From nobody Mon Dec 1 22:41:29 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (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 99B56321445 for ; Wed, 26 Nov 2025 11:36:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764156976; cv=none; b=jEz2mSqceRnvBqyStdIW+9tOr6fLPpDPMqPpa4qV+9zj804fSwrcDFlRwcqMu9MR99j9jqEJZ/Zf6YrM088kAILdceLxWkD6dKkPVjKRFmxaxFf3s2TnNPIpEOQS+lDYJAdAL+Xl1+tmjUQKXZHu2lgkjZTvzhLX5LZXBU0mgns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764156976; c=relaxed/simple; bh=PeVvTjCmd4Oc1oHakedkbqLO4HGKb2i1noZCpUoiAjI=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=mw0VO3iFG1I7PxTfN3/Q5oFVcdPSV2c9kkC3JD6FFHczACaoZp4L0TqgkPJ6iUCSfOJ4SCGUFT4k3I9jm6fhCXZCaH/r7Zm+mo++MjAYpaJgW2F0Zk7fykXfc2348KgWkiLv+AsZZd2jcBzar6O2TfzCL0TbG/vzcpK7Fb+GU8A= 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=QIfI2aFP; arc=none smtp.client-ip=209.85.210.177 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="QIfI2aFP" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-7a435a3fc57so6906620b3a.1 for ; Wed, 26 Nov 2025 03:36:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764156974; x=1764761774; 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=Uil2Il4w5CQBlSAGS/bzpb35w7uNI01Ta2KYtAr1mdw=; b=QIfI2aFPzcb6+1MeZ/+O6EXKzR6S01AWLQ8EOp1+6Slj0WyOC00QkmBEPy6oBTyOwh j6Jnz7mp/dscrG+yvkTSPvD0d4ncryX9eFXj2Pi3fBW1llSqmFSoSUKhVsepCIYy06z6 J+QRuKEX3niVX1Xr7hvAV4fDySs4jjLwvbqzZMc+fOgzSFWIC0/ixjLz1z8JIR6Nj+zp z8v1xac0g3NtsOiX5U3/6Ga4xbr+OjEfP488C4OpnEOfjFyV/Aeq2iyuH/lxaKG4oNZ5 l+KrcaKcuF7JkHTtzPsH6CxK/thdR4Eu2XbNhqpkquPuGjcFaq27WE21rGmIdY4/grbn cxsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764156974; x=1764761774; 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=Uil2Il4w5CQBlSAGS/bzpb35w7uNI01Ta2KYtAr1mdw=; b=hSNGZtnmrdrbrihLGlX7LDK9UVJfgT+8d1up6ZxgzUJ2uXR5siRGueTbwNg+lSbIfy puiGy4gdXDzwF+RqGfV8upOB9xmylXEqBfJGfEPrHFiglDoUEKmz+uoRB3iXFKrVmVbZ JITX+e5UVz7GraCSdlVf1K9I5XnlQoYwBwuELmLw4TkQUDAxxe4P4nmNNRh/eEf/xLzB eX5Cr1Ro0nRXtWthxPIoFbmf9nEFTIxezm2NWk9raKlpfNh11FDgTHpDoXJJsbxEUf3V wNd535qidZiLESNqdXF4ItGgCmieshvqePt3s9p9KR0GRMZJgC+a05TRAUcex9O4SePs yIaQ== X-Forwarded-Encrypted: i=1; AJvYcCVtkikpfJBpWGllR8Wb+B+iUo5L51ZyMgHr4I+CBPBEygzbLUagdASUqBJhws9dj0lhRXBHO5fW3Whbwfw=@vger.kernel.org X-Gm-Message-State: AOJu0YxgP6rBZHt1l3SEK2dufNCMuvx2imVMEUoiyNpRmAfaJrCrMkWY PkhAbNm6nUmKEN/aowuYaIp3MRXKmPqNRZnHa95X5Qe7ISZK0bA4z1Qt7p3+Ph5lrGA= X-Gm-Gg: ASbGncvRSC2jC3KuC2IsL2Zn1V0hl1UILEbD/84vqHjP6FfazitVGTfZO5tmDXfuf82 NvXuTwYF9o6Da1ppUawzxelcAvIT665q+FJW8KpVd+wplU2EDEf7h+oiPUZ1BmSLz0kuD/KGxdG z6ykoBjVXV4VaBJSm/V7QCy8O6c1p1YgfOwCisAqqYN8snbNbHZPzg+zSYPqzBXieaASq931+B0 vpSGo8jpOig6lAj+RTlFj2+HwdinJ/IxmznjduVZzE+D2fmQYzmkcOYUTWW9dRIW9drVJsTkDz7 nSPy6bVLoexY4W3FjoTpTE+7hxIbGIv+I7SCUWGlMTWLBtSAsJEV/v+9VZ3WaK2SxJUTXxIEpqw zVwEUsReXQ2X1OljRrR7iEIGP/0Er7Yb/q5BRvRskgLg7jd06v8wDqoQaVYXyza0WTgGu6lgMz4 JmjIs0Ph9Elfl9MESYEvaVciR0zZlEF0EILKKpQZOevubcyyg6PYlMnhr4im+WRNE2dwMb6iNGx tKG X-Google-Smtp-Source: AGHT+IFXIlKZSAs2PXMs0uvPOZ0ATWHglXb4Ps0dtinZPMgyKJ9GTPxDWoMXoCehTfNwNvHv8hb3rQ== X-Received: by 2002:a05:6a00:2183:b0:7b9:d7c2:fdf9 with SMTP id d2e1a72fcca58-7c58e113a7cmr22727111b3a.15.1764156973529; Wed, 26 Nov 2025 03:36:13 -0800 (PST) Received: from 2045D.localdomain (128.sub-75-221-107.myvzw.com. [75.221.107.128]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7c3ed471f8dsm21593159b3a.23.2025.11.26.03.36.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 03:36:13 -0800 (PST) From: Gui-Dong Han To: linux@roeck-us.net Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Gui-Dong Han Subject: [PATCH] hwmon: (lm87) Convert macros to functions to avoid TOCTOU Date: Wed, 26 Nov 2025 19:35:42 +0800 Message-ID: <20251126113542.9968-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: quoted-printable Content-Type: text/plain; charset="utf-8" The macro FAN_FROM_REG evaluates its arguments multiple times. When used in lockless contexts involving shared driver data, this causes Time-of-Check to Time-of-Use (TOCTOU) race conditions. Convert the macro to a static function. This guarantees that arguments are evaluated only once (pass-by-value), preventing the race conditions. Adhere to the principle of minimal changes by only converting macros that evaluate arguments multiple times and are used in lockless contexts. Link: https://lore.kernel.org/all/CALbr=3DLYJ_ehtp53HXEVkSpYoub+XYSTU8Rg=3D= o1xxMJ8=3D5z8B-g@mail.gmail.com/ Signed-off-by: Gui-Dong Han --- Based on the discussion in the link, I will submit a series of patches to address TOCTOU issues in the hwmon subsystem by converting macros to functions or adjusting locking where appropriate. --- drivers/hwmon/lm87.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/hwmon/lm87.c b/drivers/hwmon/lm87.c index d2d970e73c61..37bf2d1d3d09 100644 --- a/drivers/hwmon/lm87.c +++ b/drivers/hwmon/lm87.c @@ -116,8 +116,14 @@ static u8 LM87_REG_TEMP_LOW[3] =3D { 0x3A, 0x38, 0x2C = }; (((val) < 0 ? (val) - 500 : \ (val) + 500) / 1000)) =20 -#define FAN_FROM_REG(reg, div) ((reg) =3D=3D 255 || (reg) =3D=3D 0 ? 0 : \ - (1350000 + (reg)*(div) / 2) / ((reg) * (div))) +static int fan_from_reg(int reg, int div) +{ + if (reg =3D=3D 255 || reg =3D=3D 0) + return 0; + + return (1350000 + reg * div / 2) / (reg * div); +} + #define FAN_TO_REG(val, div) ((val) * (div) * 255 <=3D 1350000 ? 255 : \ (1350000 + (val)*(div) / 2) / ((val) * (div))) =20 @@ -465,7 +471,7 @@ static ssize_t fan_input_show(struct device *dev, struct lm87_data *data =3D lm87_update_device(dev); int nr =3D to_sensor_dev_attr(attr)->index; =20 - return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr], + return sprintf(buf, "%d\n", fan_from_reg(data->fan[nr], FAN_DIV_FROM_REG(data->fan_div[nr]))); } =20 @@ -475,7 +481,7 @@ static ssize_t fan_min_show(struct device *dev, struct = device_attribute *attr, struct lm87_data *data =3D lm87_update_device(dev); int nr =3D to_sensor_dev_attr(attr)->index; =20 - return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr], + return sprintf(buf, "%d\n", fan_from_reg(data->fan_min[nr], FAN_DIV_FROM_REG(data->fan_div[nr]))); } =20 @@ -534,7 +540,7 @@ static ssize_t fan_div_store(struct device *dev, return err; =20 mutex_lock(&data->update_lock); - min =3D FAN_FROM_REG(data->fan_min[nr], + min =3D fan_from_reg(data->fan_min[nr], FAN_DIV_FROM_REG(data->fan_div[nr])); =20 switch (val) { --=20 2.43.0