From: sashiko-bot@kernel.org
To: skxby <2374604267@qq.com>
Cc: linux-hwmon@vger.kernel.org
Subject: Re: [PATCH 2/2] hwmon: (tmp108) add Rust TMP108 driver
Date: Fri, 16 Oct 2026 07:35:54 +0000 [thread overview]
Message-ID: <sashiko-outbox-173940@kernel.org> (raw)
In-Reply-To: <tencent_EF01D718C016C6E011BFDF39B38933C0A807@qq.com>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [High] hwmon: tmp108: panic via arithmetic underflow in write_update_interval()
- [Medium] hwmon/tmp108: missing hardware initialization in init
- [Low] hwmon: hardware monitoring driver registered from outside drivers/hwmon/ violates layering
- [Low] kconfig: SAMPLE_RUST_TMP108 tristate config depends on HWMON=y preventing module builds
--
commit 78120c93b1be27841c1bf9909b41399a14b830f6
Author: skxby <2374604267@qq.com>
hwmon: (tmp108) add Rust TMP108 driver
Add a Rust driver for the TI TMP108 temperature sensor, mirroring the
existing C driver (drivers/hwmon/tmp108.c).
> diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig
> index 31d62533ef25f..18df4282756c3 100644
> --- a/samples/rust/Kconfig
> +++ b/samples/rust/Kconfig
[ ... ]
> +config SAMPLE_RUST_TMP108
> + tristate "TMP108 Driver"
> + depends on HWMON=y
> + depends on I2C=y
[Severity: Low]
Does this introduce a Kconfig regression? If CONFIG_HWMON=m or CONFIG_I2C=m,
this prevents the sample driver from being built at all, even as a module.
Should standard dependency strings like depends on HWMON and
depends on I2C be used to inherit module constraints properly?
> diff --git a/samples/rust/tmp108.rs b/samples/rust/tmp108.rs
> new file mode 100755
> index 0000000000000..a070547f29ee4
> --- /dev/null
> +++ b/samples/rust/tmp108.rs
[ ... ]
> +fn find_closest_descending(x: c_long, samples: &[u16]) -> usize {
[ ... ]
> + while i >= 1 {
> + let mid = (samples[i] as c_long + samples[i - 1] as c_long) / 2;
> + if x <= mid {
> + let left = x - samples[i] as c_long;
[Severity: High]
Can this code panic due to an arithmetic underflow regression?
If userspace writes a large negative value (e.g., LONG_MIN) to the
update_interval sysfs attribute, it is passed unmodified to this function.
Subtracting a positive sample value from c_long::MIN will underflow here.
In debug builds or when CONFIG_RUST_OVERFLOW_CHECKS=y is set, this
triggers a panic, crashing the kernel. In release builds, it silently
wraps around and sets an incorrect hardware conversion rate.
Could we clamp the value before subtraction, or use saturating math?
[ ... ]
> + fn write_update_interval(&self, value: c_long) -> Result {
> + let idx = find_closest_descending(value, &SAMPLE_TIMES);
[Severity: High]
Is it possible to pass an unclamped value here?
Since the value passed from userspace via sysfs is not clamped before
calling find_closest_descending(), an extreme negative value can reach
the subtraction above and cause an underflow panic.
[ ... ]
> + fn init(_module: &'static ThisModule) -> Result<Self> {
[ ... ]
> + // Registration failure path: if `Registration::new` fails and `?` returns early, the
> + // already-created i2c client is never unregistered. Such a leftover client keeps the
> + // bus address 0x48 occupied forever, making every subsequent insmod fail with EBUSY.
> + // The failure branch must therefore unregister the client explicitly (cleanup on the
> + // hwmon side is handled by the hwmon core itself).
> + let hwmon = match Registration::new(parent, c"tmp108", Tmp108::new(client)) {
[Severity: Low]
Does registering a hardware monitoring device from outside drivers/hwmon/
violate subsystem layering rules?
The HWMON subsystem guidelines state that hardware monitoring drivers should
reside in drivers/hwmon/. While this is a sample driver, directly using
the hwmon registration API from samples/rust/ bypasses this architectural
layout rule.
[Severity: Medium]
Are we missing hardware initialization for the TMP108 device during init?
Unlike the C driver, this code registers the hwmon device without enabling
the regulator or configuring the CONF register (e.g., writing
TMP108_MODE_CONTINUOUS and clearing TMP108_CONF_TM).
If the chip is in shutdown mode from the bootloader, continuous conversions
will not occur, and accessing sysfs attributes like temp1_input could
return stale temperature readings to userspace.
> + Ok(hwmon) => hwmon,
> + Err(e) => {
> + // SAFETY: client was created successfully in this function (non-null,
> + // non-ERR_PTR) and is not yet owned by hwmon (registration failed), so no
> + // in-flight callback touches the pointer.
> + unsafe { bindings::i2c_unregister_device(client) };
> + return Err(e);
> + }
> + };
> +
--
Sashiko AI review · https://sashiko.dev/#/patchset/tencent_95E7F9B5CE294CA4027A0CD4C550B454050A@qq.com?part=2
next prev parent reply other threads:[~2026-10-16 7:35 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <179213545522.40444.8748988877722946371@qq.com>
2026-10-16 7:24 ` [PATCH 2/2] hwmon: (tmp108) add Rust TMP108 driver skxby
2026-10-16 7:35 ` sashiko-bot [this message]
2026-10-16 7:24 ` [PATCH 1/2] rust: hwmon: add hwmon abstractions skxby
2026-10-16 7:33 ` sashiko-bot
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=sashiko-outbox-173940@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=2374604267@qq.com \
--cc=linux-hwmon@vger.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.