From nobody Mon Dec 1 22:34:53 2025 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 D5E1E309EEA for ; Wed, 26 Nov 2025 11:38:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764157129; cv=none; b=VR42py6SzNp/zhf48+jo4leUx5xS7dDUTZW5INIG/2t5KOt/fkuv6bojmCnMJeyjGJTlvJ8oDUcWrKbu8BxtGQj5eWMNCBJFfoiwfZHt054G3IsPxCA1B8XBkKItAdl66KLoYdJ6tdFkSBqji/wS1KNcUGx7pyTXiB5Vueve6kM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764157129; c=relaxed/simple; bh=ui/YOsXzrX8cyfCbmF+r8+AOfEjRvMX/07F09KIqgyY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=aEf9S0rNewj2rD7SnVASJSf2Q9LsY7rfcdvJk/ZnZK/tfR6r2CbMRF9gxMjKSqB/sTEizGvE02MK1pWtycJGdlWc7SyR30ElrnRs9P5xyCwj/NeuWhe4jf/1ZdJT6LgJnTJEzhc5HcMMtOPtPv6qUsVErlkFBTM+bG+3omWlq+g= 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=FW3pmSRw; arc=none smtp.client-ip=209.85.210.169 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="FW3pmSRw" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-7bab7c997eeso7407192b3a.0 for ; Wed, 26 Nov 2025 03:38:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764157123; x=1764761923; 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=ZOi2WEBkFdFa7VsGEA+18NFkgGtbS2j7+UJmehxcAHQ=; b=FW3pmSRwNG8AnaCGpOWwGQaVkh/n29s28HOKdGLPkFJO6pr8zj1dEtviEDNDt2c4xE c4tP+wJMEGp5F8MUE0d17cb7USubi6/sTsqHG1s9yR1R2rkjg4/F+dpTwSr2Q3+fgKLU Ki2Y20A19xUtI+eHPkp4Fk7GSUJq2HdRJZebm5iWq2oKe0uZCSRwGm1ipzsCbROLx9oD TIlR4E/3k5zIvaX5l/6loCYQjkRtJs+PwsEAZKExWIHw3HU7jrrtg2OiKeUGssaepUA2 Ixhb1XeiV0B+bbLjlUVz5qCQRY+M9BWOBuxJkzA3ePLy1dLep0eH4vflHFWCyaRSR623 2xVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764157123; x=1764761923; 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=ZOi2WEBkFdFa7VsGEA+18NFkgGtbS2j7+UJmehxcAHQ=; b=Ps7NrAWMrsAN/NMwkqw1zGmL2+shTrSYNkSrkKMeDqfGzixZ/JUeOgneKZwpbfpN7/ 4G82acvTsFXsxSdMrdCuIT5b06gFIlFLCMgm/RaqyfVebKPI9iXTG8sH5lH1ggsvO0zW 0pDvu4cOGfiq6j7wjeZ3QoG/7auiMu5OlWRHUqZawNxgUSCcXw9n3fRR6bcNd8EGPShB Tl+Wylqa++qCxUyTQlEBgp+r7ujGhcAFCK29DPgrBnkizuME6mJyHay/o0G4tUsD6WPV c2feW3cf5eRDj3xNXO8pMocnrMFknavRQs5pzk3mKOumuntLZoC7bFvAsaw9lpzACgg/ 7gEg== X-Forwarded-Encrypted: i=1; AJvYcCXTfClgRS/raDXrQqlD/pwNalOm7YoYTAtv/FuuCMr0BPvlKc/XAyZPp86ziq2uv28gAOEYAjMhWZUCexo=@vger.kernel.org X-Gm-Message-State: AOJu0Yyb/1KNE7YO9CTo5/EwOXRiFtwB6CZIJRz5l3L98DNxX2hI7UVt aN3FaTkuVntMpFMzFAcMNdzjdhqR7qE3Gl/JgSbfCKFj1NtqHs2v2KlH X-Gm-Gg: ASbGncs02hkp71W5YXNv6xn09lsMlSgcdRrrIrC64OH8th0HS8x1vTwtxue7+c+FYSS 5NSm2epF+vB3/LpXekUKyK/fXjEit2PUWfF+ULwO9PSWKaNSvoNd9NDKsTq/coMcqDhilqBixiK dCaUjCB83oP1L4HSgR/NxRp7mn0sivuo3JPV4r6fDUHrr9UeYhBduyKf0cjLJpcckTCmJBBripm XJqvnu8NkX0egdGlw3BzOrSK/iCzw3INfxpv/bcEtymLZlWMKBkHDNjUVG8lgpbQ60IWxm+VqeS F6Yc31sWA+1F6/+HMQKewB8Pl76q49GJuoOGiqUHMC/e2TdtcQRrQPDV0rr2kihjMlMGJsj67ix Nys8Qw85zGiICo4gliSsjkap1Lq2npNQ+N+JqqAHgCdsZf7vQqr/rvA4heM4A7SlbfUFszQiB74 8UnEcJP8iS0wZiQGllrc5MYe7nhH8pTY63K+7reLc9SzDSdxOnZm78uxHTmRHpsmDzRl9raYgHA R7K X-Google-Smtp-Source: AGHT+IE0lnk3M01cCR0Ii+MTstl2vJZu02+w/siYJjllyFVjijcbmhjnSSUe6jjnZMWKPFf5baUo3w== X-Received: by 2002:a05:6a00:a245:b0:7a4:1880:e25e with SMTP id d2e1a72fcca58-7c58e9f97d4mr18303051b3a.30.1764157122869; Wed, 26 Nov 2025 03:38:42 -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-7c3f155d053sm21237249b3a.62.2025.11.26.03.38.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 03:38:42 -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: (adm1026) Convert macros to functions to avoid TOCTOU Date: Wed, 26 Nov 2025 19:38:28 +0800 Message-ID: <20251126113828.10003-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/adm1026.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/hwmon/adm1026.c b/drivers/hwmon/adm1026.c index 80d09b017d3b..c38c932e5d2a 100644 --- a/drivers/hwmon/adm1026.c +++ b/drivers/hwmon/adm1026.c @@ -197,8 +197,16 @@ static int adm1026_scaling[] =3D { /* .001 Volts */ #define FAN_TO_REG(val, div) ((val) <=3D 0 ? 0xff : \ clamp_val(1350000 / ((val) * (div)), \ 1, 254)) -#define FAN_FROM_REG(val, div) ((val) =3D=3D 0 ? -1 : (val) =3D=3D 0xff ? = 0 : \ - 1350000 / ((val) * (div))) + +static int fan_from_reg(int val, int div) +{ + if (val =3D=3D 0) + return -1; + if (val =3D=3D 0xff) + return 0; + return 1350000 / (val * div); +} + #define DIV_FROM_REG(val) (1 << (val)) #define DIV_TO_REG(val) ((val) >=3D 8 ? 3 : (val) >=3D 4 ? 2 : (val) >=3D = 2 ? 1 : 0) =20 @@ -656,7 +664,7 @@ static ssize_t fan_show(struct device *dev, struct devi= ce_attribute *attr, struct sensor_device_attribute *sensor_attr =3D to_sensor_dev_attr(attr); int nr =3D sensor_attr->index; struct adm1026_data *data =3D adm1026_update_device(dev); - return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr], + return sprintf(buf, "%d\n", fan_from_reg(data->fan[nr], data->fan_div[nr])); } static ssize_t fan_min_show(struct device *dev, struct device_attribute *a= ttr, @@ -665,7 +673,7 @@ static ssize_t fan_min_show(struct device *dev, struct = device_attribute *attr, struct sensor_device_attribute *sensor_attr =3D to_sensor_dev_attr(attr); int nr =3D sensor_attr->index; struct adm1026_data *data =3D adm1026_update_device(dev); - return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr], + return sprintf(buf, "%d\n", fan_from_reg(data->fan_min[nr], data->fan_div[nr])); } static ssize_t fan_min_store(struct device *dev, --=20 2.43.0