From: sashiko-bot@kernel.org
To: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: linux-hwmon@vger.kernel.org
Subject: Re: [PATCH v1 2/2] Revert "thermal: hwmon: Register a hwmon device for each thermal zone"
Date: Fri, 31 Jul 2026 13:19:26 +0000 [thread overview]
Message-ID: <20260731131926.BB9081F000E9@smtp.kernel.org> (raw)
In-Reply-To: <2301040.irdbgypaU6@rafael.j.wysocki>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] The error handling path in `thermal_add_hwmon_sysfs()` unconditionally frees a shared `hwmon` device, causing a Use-After-Free vulnerability.
- [High] Lack of reference counting and inadequate lock scope for shared `hwmon` devices lead to TOCTOU races, duplicate device registration, and Use-After-Free vulnerabilities.
- [Medium] Unprotected concurrent modification of `hwmon->count` causes data races and sysfs file name collisions.
--
--- Patch [2]: [PATCH v1 2/2] Revert "thermal: hwmon: Register a hwmon device for each thermal zone" ---
commit 811b1574f43c922402d0fcdcdca33812b6bd90b8
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Revert "thermal: hwmon: Register a hwmon device for each thermal zone"
This commit reverts a previous change to thermal zone hwmon device names and
sysfs layout, restoring the behavior where thermal zone devices with the same
type share one hwmon device.
Link: https://lore.kernel.org/linux-pm/cafd8af9-c6e9-4bf2-b496-23e796fbc9a6@linux.dev/
Link: https://lore.kernel.org/linux-hwmon/ab8b093b-46e6-4738-afcf-4b97c9ad5af9@googlemail.com/
> diff --git a/drivers/thermal/thermal_hwmon.c b/drivers/thermal/thermal_hwmon.c
> index 223ae1571655b..597c33c8a5550 100644
> --- a/drivers/thermal/thermal_hwmon.c
> +++ b/drivers/thermal/thermal_hwmon.c
[ ... ]
> @@ -91,6 +88,45 @@ temp_crit_show(struct device *dev, struct device_attribute *attr, char *buf)
> return sysfs_emit(buf, "%d\n", temperature);
> }
>
> +
> +static struct thermal_hwmon_device *
> +thermal_hwmon_lookup_by_type(const struct thermal_zone_device *tz)
> +{
> + struct thermal_hwmon_device *hwmon;
> + char type[THERMAL_NAME_LENGTH];
> +
> + mutex_lock(&thermal_hwmon_list_lock);
> + list_for_each_entry(hwmon, &thermal_hwmon_list, node) {
> + strscpy(type, tz->type);
> + strreplace(type, '-', '_');
> + if (!strcmp(hwmon->type, type)) {
> + mutex_unlock(&thermal_hwmon_list_lock);
> + return hwmon;
[Severity: High]
Does this introduce a race condition resulting in a use-after-free?
If a thread calls thermal_hwmon_lookup_by_type(), the lock is dropped before
returning the shared hwmon pointer. If another thread concurrently removes the
last thermal zone for this type via thermal_remove_hwmon_sysfs(), it could
free the hwmon device while the first thread is still executing
thermal_add_hwmon_sysfs().
Would it be safer to hold a reference count on the shared hwmon object before
dropping thermal_hwmon_list_lock?
> + }
> + }
> + mutex_unlock(&thermal_hwmon_list_lock);
> +
> + return NULL;
> +}
> +
[ ... ]
> @@ -101,39 +137,54 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
[ ... ]
> + register_sys_interface:
> + temp = kzalloc_obj(*temp);
> + if (!temp) {
> + result = -ENOMEM;
> + goto unregister_name;
> + }
> +
> + temp->tz = tz;
> + hwmon->count++;
> +
> + snprintf(temp->temp_input.name, sizeof(temp->temp_input.name),
> + "temp%d_input", hwmon->count);
[Severity: Medium]
Is it possible for concurrent probes to race on hwmon->count?
If two threads execute thermal_add_hwmon_sysfs() for the same thermal zone
type simultaneously, they could increment hwmon->count outside of any lock.
Could this lead to both threads formatting identical sysfs attribute names
and causing device_create_file() to fail with -EEXIST?
> + temp->temp_input.attr.attr.name = temp->temp_input.name;
> + temp->temp_input.attr.attr.mode = 0444;
[ ... ]
> @@ -145,17 +196,21 @@ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
[ ... ]
> unregister_input:
> device_remove_file(hwmon->device, &temp->temp_input.attr);
> + free_temp_mem:
> + kfree(temp);
> unregister_name:
> - hwmon_device_unregister(hwmon->device);
> + if (new_hwmon_device)
> + hwmon_device_unregister(hwmon->device);
> free_mem:
> kfree(hwmon);
[Severity: High]
Will this unconditionally free the shared hwmon object on an error path?
If new_hwmon_device is 0 (meaning the hwmon device was found via
thermal_hwmon_lookup_by_type and is shared), and an error occurs during sysfs
file creation, execution jumps to free_mem. Calling kfree(hwmon) here would
destroy the shared object while it is still in use by other thermal zones.
Should this kfree() be conditional on new_hwmon_device being true?
> - return 0;
> + return result;
> }
> EXPORT_SYMBOL_GPL(thermal_add_hwmon_sysfs);
--
Sashiko AI review · https://sashiko.dev/#/patchset/6319276.lOV4Wx5bFT@rafael.j.wysocki?part=2
prev parent reply other threads:[~2026-07-31 13:19 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-31 12:59 [PATCH v1 0/2] thermal: hwmon: Restore automatic hwmon device registration Rafael J. Wysocki
2026-07-31 13:00 ` [PATCH v1 1/2] Revert "thermal: hwmon: Use extra_groups for adding temperature attributes" Rafael J. Wysocki
2026-07-31 13:20 ` sashiko-bot
2026-07-31 13:01 ` [PATCH v1 2/2] Revert "thermal: hwmon: Register a hwmon device for each thermal zone" Rafael J. Wysocki
2026-07-31 13:19 ` sashiko-bot [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260731131926.BB9081F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-hwmon@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.