From nobody Mon Dec 1 22:35:41 2025 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 64E1C258EC2 for ; Wed, 26 Nov 2025 11:41:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764157263; cv=none; b=IR51qpx/qv9jLItP0eTjPAFFiL9Uf9h+8HtnTwYqXlDjsY2du+pdSqOHl1RXgHwXci6Np7cnstZc1V0p6eBXA7By9ijMng4CtWHwFUY3jq394uMWRcL/7j3sMTVgzeyu7NxnQlNPcl+SaskjHkd8LlNdoZkNcojxIR3XByY234s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764157263; c=relaxed/simple; bh=TgrzW04OurC6JFpNdugLPojVTkqtrttQ9ARoSbtk3u4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=akJ2oUyptJ8WYBUo5FOJumuu5tt3e+CmBC4wIUAN4yxtpFFks2lJWKA7vsWgoY8WeXRuxaSEL9APgpPrNm6eR/DZa5NRM8Ll91LqSY7MfzvIzF3Hnc1WfEQ4GN55y2lPdsFBDGPENZ3e6XsFtG8S8RqioazDIrtBq/4CZf8FNtI= 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=NreqoY91; arc=none smtp.client-ip=209.85.214.173 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="NreqoY91" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-29812589890so77468445ad.3 for ; Wed, 26 Nov 2025 03:41:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764157262; x=1764762062; 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=hHDo2OBspjM/pUXdeybYNxNYiOYioqpiTsRPZh3n3mU=; b=NreqoY91S18kOX359o3JQcoy1YqZsFu4LLXV+AwMLHVOmDoxGgYNV515rWQavk1JFa g1RlYZugabZjMrrbL1c5F1048GNJiqp0W1mbKHv4C0THOn89xGL+qW03po0PYPiUI7fe 6MxWosUrtlWzwS5f7O4DVhx+NllImjusDKHgkyfOn4AYrfaZsHkqF6jgGDjXrP59HlpV iEoMMvvJI5zTmC4VmdbrpOFhmJKo88RgwYpWlfKALO1mXehL650yaJ23E8IfNlDGMEvF LE75J8aGgu5ZnUiOFd1X9cki1RXlOH1G9mWXfZJfNaOYLlE/d4Q/c9s/tgdMJeYUdnXl a0Mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764157262; x=1764762062; 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=hHDo2OBspjM/pUXdeybYNxNYiOYioqpiTsRPZh3n3mU=; b=m4H3yR/V8VbyEiDOo60DrwuneRIewSz3vEXWGx6pAx1dV9h7xjIencyNr8z5RDd6yt j4htjz9m6ngULV0JelUpYhbVXZcJUB6BmK/wKw/Ejoj8Zzd7I/klKtURxNrGalW/fU7o /i87BgRS0wfObOrwcWTrxFUJTngLlTznOrJC/4sfCxqNVaaVxOIBtnx27rQkFn9HokWE mwgsM0nlJ6clRa3tcU7OzXlmJMqqdqA5QhcJEvszuruvNQ8NXLjPmd2w0uXUgFHxbGxP qgx5iS1YHFmC8g/whT1LgExf2ZJcVbEnc9Ac+vADg4TrWy4XaqA+gkbi/XvBH93sD3Xk zC1A== X-Forwarded-Encrypted: i=1; AJvYcCUAesPCAS8X7wB1rHGTNACWR8PAMeo2vSeAilDHGV34S9vMZUgjPY8p51y5KX3XgVgAJD28DNiRB7vvaIg=@vger.kernel.org X-Gm-Message-State: AOJu0Yxa0c/G8AjIhK4RneBefQ/vDNnjecba/qf8snJEC4s9nVsjm/ap Z+QJnzcmQ5MxFj0dre7W1WOP6jMMVQFeAlCD4csjbDpRPjoE75a12Lo0 X-Gm-Gg: ASbGnctl7iS61uEuXLwoYIr+NfSF5DEGuD2PD1MrgQXB0iCwbrbLlvBfFJgFJ8XhnE2 bBZt4hCdQYK+TYIJwn/IzGmqA2so27H9l1GxhAT68xIBQgyW6bKSrNyBoEbog+bAmUiYicC+7nw 5woesM/QiBcMMsdgL9YQlSk1oJ7rSj2/IimawLVL5gCU6K9RqqAVM9L29RUqeBbuQOueUqDF5RF WyMpJPGeESyuc9cxgPKQDuC1SlgsqEL8/HITVY6cP5ulAVtqXbLzz7Q9nHBXenC11B+M1sGozVz uK4n2JkbfJ67AQ4InVYqAyHaNkIM8zmMk8dq4DarIGwo9iFpZayWRLogbkYHTr20MYi99Acgs3L VrXVyvASKTY7VEGKBVgFf7xiaLhVu9xBT8JMFWUuz6SZSz8hz5BXx6au2Kte0l6/uG9AtHjicZx hveZ4yz4m1qZ6VJZRLRNx5cbDAGxkZCTQhNwxiBvQgr4HoVCPW40FGbwnPJuydV2LURFaBXgcdr +tw7aP+pkaZYwk= X-Google-Smtp-Source: AGHT+IHHpPqLQo2V90IQyAzr/hlLRXqNt9ClWiZZ5j/0UklvOI90hooliPxiAW8tTJtFCLH3s1RZrA== X-Received: by 2002:a17:902:ccce:b0:297:dd30:8f07 with SMTP id d9443c01a7336-29b6bf806bcmr231164605ad.50.1764157261589; Wed, 26 Nov 2025 03:41:01 -0800 (PST) Received: from 2045D.localdomain (128.sub-75-221-107.myvzw.com. [75.221.107.128]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29b5b13de62sm197304325ad.36.2025.11.26.03.40.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 03:41:01 -0800 (PST) From: Gui-Dong Han To: clabbe.montjoie@gmail.com, linux@roeck-us.net Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Gui-Dong Han Subject: [PATCH] hwmon: (adm1029) Add locking to avoid TOCTOU Date: Wed, 26 Nov 2025 19:40:46 +0800 Message-ID: <20251126114047.10039-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 function fan_show checks shared data for zero or invalid values before using it as a divisor. These accesses are currently lockless. If the data changes to zero between the check and the division, it causes a divide-by-zero error. Explicitly acquire the update lock around these checks and calculations to ensure the data remains stable, preventing Time-of-Check to Time-of-Use (TOCTOU) race conditions. 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/adm1029.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/hwmon/adm1029.c b/drivers/hwmon/adm1029.c index 761c13092488..71eea8ae51b9 100644 --- a/drivers/hwmon/adm1029.c +++ b/drivers/hwmon/adm1029.c @@ -171,14 +171,17 @@ fan_show(struct device *dev, struct device_attribute = *devattr, char *buf) struct adm1029_data *data =3D adm1029_update_device(dev); u16 val; =20 + mutex_lock(&data->update_lock); if (data->fan[attr->index] =3D=3D 0 || (data->fan_div[attr->index] & 0xC0) =3D=3D 0 || data->fan[attr->index] =3D=3D 255) { + mutex_unlock(&data->update_lock); return sprintf(buf, "0\n"); } =20 val =3D 1880 * 120 / DIV_FROM_REG(data->fan_div[attr->index]) / data->fan[attr->index]; + mutex_unlock(&data->update_lock); return sprintf(buf, "%d\n", val); } =20 --=20 2.43.0